powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Linux: C++, GUI, thread
25 сообщений из 35, страница 1 из 2
Linux: C++, GUI, thread
    #39094859
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Люди добрые помогите примером-советом, надо написать приложение оконное под линукс на C++ чтобы по нажатию кнопки Start создавался поток который бы выводил время в поле ввода каждую секунду, а по нажатию кнопки Stop поток бы завершался.
На Java я бы это минут за 5-10 сделал, а на C++ даже не представляю что делать, помогите плс.

Если я правильно понял то оконные приложения под линуксом разрабатываются в Qt Creator-е?
Если это важно то у меня: gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39094911
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ka,

Если так, то отдельный поток тут и не нужен. Достаточно в цикле, в котором ты выводишь время, вызывать qApp->processEvents().
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39094913
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я понимаю что именно для такого случая как я написал поток не нужен, но он нужен мне чтобы развивать приложение и не задавать много лишних глупых вопросов потом.
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39096237
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ ну хоть кто нибудь помогите, если не кодом то хотябы советом, Как под линукс на C++ делать оконные приложения с потоками и чтобы эти потоки могли обновлять GUI?
Единственное что я пока нарыл это Qt Creator есть ли альтернатива Qt Creator-у? и как в Qt Creator-е можно потоки использовать?
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39096267
m_Sla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ka, книга Шлее М. Qt4.5. Профессиональное программирование на C++ ( 2010 )
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39097105
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_KaНарод ну хоть кто нибудь помогите, если не кодом то хотябы советом, Как под линукс на C++ делать оконные приложения с потоками и чтобы эти потоки могли обновлять GUI?

Ну, например, Qt с QTCreator. Можно ещё на GTK, можно ещё на XWidgets, на Tk, на чистых X-ах.

Alex_KaЕдинственное что я пока нарыл это Qt Creator есть ли альтернатива Qt Creator-у?


Ну, я дал варианты.

Alex_Kaи как в Qt Creator-е можно потоки использовать?

Так же, как и не в Qt Creator, использование потоков от библиотеки GUI-элементов не зависит.
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39097114
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
m_Sla,

Спасибо, то что надо! :)
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39097117
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,

Ну в Java из обычных потоков нельзя GUI обновить - поэтому и спрашивал.

Еще вопрос по сборке проекта, если я буду использовать cmake то я смогу получить исполнимый файл в итоге или cmake только проверяет проект, библиотеки, заголовки?
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39097124
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_KaНу в Java из обычных потоков нельзя GUI обновить - поэтому и спрашивал.Нигде нельзя. Если хочешь жить без проблем - главный поток работает с ГУИ, остальные только считают, и иногда сообщают главному потоку что они закончили считать какой-то этап.

Alex_KaЕще вопрос по сборке проекта, если я буду использовать cmake то я смогу получить исполнимый файл в итоге или cmake только проверяет проект, библиотеки, заголовки?Нет конечно.
CMake это сценарий сборки для бедных. Результат работы cmake - будет makefile который уже настоящий сценарий сборки.
По правилам записанным в makefile уже будет запускаться компилятор, который произведет объектные файлы.
А потом запустится линкер, который уже и соберет из объектных файлов и библиотек исполняемый файл.
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39097445
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl, спасибо с cmake-ом уже разобрался.
А как тогда из рабочих потоков корректно уведомить GUI чтобы обновить состояние?
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39097498
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_KaWhite Owl, спасибо с cmake-ом уже разобрался.
А как тогда из рабочих потоков корректно уведомить GUI чтобы обновить состояние?


установить какой то флаг, а в gui потоке его периодически проверять.
можно также посылать сообщения или события, но это platform specific.
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39103458
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот еще назрел вопрос работы с потоками и синхронизацией их, после "простоты" работы с потоками в Java на потоки в C++ страшновато смотреть но надо. У меня: gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9)
посдкажите плс. как мне собрать исполнимый файл из исходников примерно такого содержания:

//mainthread.cpp

#include <iostream>
#include <thread>

#include "mainthread.h"
#include "worker1.h"

int callFromThread() {
std::cout << "function callFromThread called from thread" << std::endl;
return 0;
}

int synchCallFromThread() {
std::cout << "function synchCallFromThread called from any thread or main thread" << std::endl;
return 0;
}

int main() {
for ( int idx = 0; idx < 10; ++idx ) {
new std::thread(foo);
synchCallFromThread();
}
return 0;
}


//mainthread.h

int callFromThread() ;

int synchCallFromThread() ;


//worker1.cpp

#include <iostream>

#include "mainthread.h"

int foo() {
std::cout << "from thread" << std::endl;
callFromThread();
synchCallFromThread();
return 0;
}


//worker1.h

int foo() ;


как сделать чтобы вызов функции synchCallFromThread был потокобезопасен, если надо эту функцию вызывать и из основного потока и из рабочих потоков? как должен выглядеть makefile для этого примера?
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39103471
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ошика в new std::thread - происходит утечка памяти.
нужно
Код: plaintext
1.
std::thread([](){/*do some*/}).detach();

detach обязательно. или нужно сздать переменную и вызывать join, но толку от потока тогда не будет :)

http://en.cppreference.com/w/cpp/thread/thread

гуй надо наверное обновлять с мутексами. то есть при любом обращении к гую нужно брать меткс гуя.

g++ -std=c++14 your_file.cpp
ну или g++ -std=c++11 если gcc о 14 стандарте ничего не знает еще :)
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39103474
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой, забыл
g++ -std=c++14 your_file.cpp -lpthread
этот -lpthread нужно когда работаешь с потоками.
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39103491
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexy_black, спасибо,
заменил new std::thread(foo);
на std::thread(foo).detach();

g++ -std=c++11 mainthread.cpp -lpthread
/tmp/ccpo7iYh.o: In function `main':
mainthread.cpp:(.text+0x125): undefined reference to `foo()'
collect2: ошибка: выполнение ld завершилось с кодом возврата 1

с ошибкой понятно компилятор не видит описания foo,
а как мне makefile сделать для этого примера из 4 файлов?

join мне не нужен т.к. мне надо чтобы у меня потоки "крутились" и основной поток продолжал работу.

А как правильно сделать "синхонизированную" функцию чтобы ее и основной поток и рабочие потоки дергали безопасно?
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39103497
YesSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Ka,

Знание джавы не освобождает от чтения документации по C++.
Конкретно по потокам я бы рекомендовал прочитать эту книжку для начала.
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39103505
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
конечно. а кто скажет компилятору где исходники foo ??

g++ -std=c++11 mainthread.cpp -lpthread

в это команду указан только один файл, а хотел вроде два скомпилировать? во втором и находится код foo, но он не добавлен к компиляции.
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39103527
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Даже я знаю, что для компиляции четырёх файлов их можно указать в комстроке (да, все) и не морочить(ся) написанием make-файла.
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39103529
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YesSql , спасибо за книжку, обязательно прочитаю. (правда там только 2 главы в открытом доступе, но для начала мне этого хватит).

alexy_black ,
да, я хотел нечно вроде: g++ -std=c++11 -o main mainthread.cpp worker1.cpp -lpthread
из makefile получить, вроде можно как-то сразу всю директорию с сырцами компилировать, а не указывать каждый в командной строке.

и еще уже конкретный вопрос по этому примеру, вот я компилирую: g++ -std=c++11 -o main mainthread.cpp worker1.cpp -lpthread
запускаю ./main и вижу что вызывается только synchCallFromThread() из основного потока а создаваемые потоки не запускаются, почему?
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39103532
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
лучше сразу создать CMakeLists.txt файл. удобнее.
там есть

find_package (Threads)

а к библиотекам исполяемого файла надо добавить
${CMAKE_THREAD_LIBS_INIT}

это добавил флаг -lpthread
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39103541
YesSql
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_Kaи еще уже конкретный вопрос по этому примеру, вот я компилирую: g++ -std=c++11 -o main mainthread.cpp worker1.cpp -lpthread
запускаю ./main и вижу что вызывается только synchCallFromThread() из основного потока а создаваемые потоки не запускаются, почему?
На запуск потока требуется время. твой корневой поток заканчивается быстрее чем стартуют создаваемые потоки. для предотврощения этого используется join перед окончанием корневого потока.
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39103548
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YesSql , спасибо,
поставлю задержку после создания потоков в основном потоке.

alexy_black , спасибо,

вот мой CMakeLists.txt :

cmake_minimum_required( VERSION 2.8 )

ADD_DEFINITIONS("-std=c++11")

set (PROJECT threads)

project (${PROJECT})

find_package (Threads)

set (HEADERS mainthread.h worker1.h)
set (SOURCES mainthread.cpp worker1.cpp)

source_group ("Header Files" FILES ${HEADERS})
source_group ("Source Files" FILES ${SOURCES})

add_executable (${PROJECT} ${HEADERS} ${SOURCES})

target_link_libraries (${PROJECT} ${LIBRARIES})

cmake .
make
./threads
terminate called after throwing an instance of 'std::system_error'
what(): Enable multithreading to use std::thread: Operation not permitted
Аварийный останов (core dumped)

объясните плс. в чем проблема?
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39103653
alexy_black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если я правильно понял, переменная ${LIBRARIES} пуста. это пожно проверить так
message("my libraries ${LIBRARIES}") при вызове cmake снова, должно отобразиться my libraries [набор_библиотек]

вот так должно сработать
target_link_libraries (${PROJECT} ${CMAKE_THREAD_LIBS_INIT})


эта переменная - ${CMAKE_THREAD_LIBS_INIT} - становиться доступной после вызова find_package(Threads)
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39138657
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Просто с потоками разобрался кажется. Теперь задача посложнее будет.
Надо сделать потоки-классы(как в java) на c++ под линукс.

Итак, надо чтобы в основном потоке были 2-е функции которые позволяют основному и рабочим потокам изменять и читать состояние некого объекта(obj) - для этого надо сделать эти функции(или часть кода в них) потокобезопасными, возникают 2 вопроса:
1. как пользоваться мутексами для этого? (или нужно что-то другое?)
2. как написать класс поток? (если это возможно?) //желательно чтобы рабочие потоки ничего не делали пока ожидают смены состояния объекта obj и чтобы основной поток мог уведомить рабочие потоки при смене статуса объекта obj.

и еще вопрос, можно-ли в потоке-классе написать функцию которая будет callback если да то как например при наличии 1000 объектов-потоков будет вызываться нужная функция сторонним приложением?
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39138658
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://en.cppreference.com/w/cpp/thread
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Linux: C++, GUI, thread
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]