Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Люди добрые помогите примером-советом, надо написать приложение оконное под линукс на C++ чтобы по нажатию кнопки Start создавался поток который бы выводил время в поле ввода каждую секунду, а по нажатию кнопки Stop поток бы завершался. На Java я бы это минут за 5-10 сделал, а на C++ даже не представляю что делать, помогите плс. Если я правильно понял то оконные приложения под линуксом разрабатываются в Qt Creator-е? Если это важно то у меня: gcc (GCC) 4.8.3 20140911 (Red Hat 4.8.3-9) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 08:46 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_Ka, Если так, то отдельный поток тут и не нужен. Достаточно в цикле, в котором ты выводишь время, вызывать qApp->processEvents(). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 09:29 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Я понимаю что именно для такого случая как я написал поток не нужен, но он нужен мне чтобы развивать приложение и не задавать много лишних глупых вопросов потом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.11.2015, 09:32 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Народ ну хоть кто нибудь помогите, если не кодом то хотябы советом, Как под линукс на C++ делать оконные приложения с потоками и чтобы эти потоки могли обновлять GUI? Единственное что я пока нарыл это Qt Creator есть ли альтернатива Qt Creator-у? и как в Qt Creator-е можно потоки использовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 10:29 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_Ka, книга Шлее М. Qt4.5. Профессиональное программирование на C++ ( 2010 ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.11.2015, 10:46 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_KaНарод ну хоть кто нибудь помогите, если не кодом то хотябы советом, Как под линукс на C++ делать оконные приложения с потоками и чтобы эти потоки могли обновлять GUI? Ну, например, Qt с QTCreator. Можно ещё на GTK, можно ещё на XWidgets, на Tk, на чистых X-ах. Alex_KaЕдинственное что я пока нарыл это Qt Creator есть ли альтернатива Qt Creator-у? Ну, я дал варианты. Alex_Kaи как в Qt Creator-е можно потоки использовать? Так же, как и не в Qt Creator, использование потоков от библиотеки GUI-элементов не зависит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 00:35 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
m_Sla, Спасибо, то что надо! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 00:46 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Ну в Java из обычных потоков нельзя GUI обновить - поэтому и спрашивал. Еще вопрос по сборке проекта, если я буду использовать cmake то я смогу получить исполнимый файл в итоге или cmake только проверяет проект, библиотеки, заголовки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 00:51 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_KaНу в Java из обычных потоков нельзя GUI обновить - поэтому и спрашивал.Нигде нельзя. Если хочешь жить без проблем - главный поток работает с ГУИ, остальные только считают, и иногда сообщают главному потоку что они закончили считать какой-то этап. Alex_KaЕще вопрос по сборке проекта, если я буду использовать cmake то я смогу получить исполнимый файл в итоге или cmake только проверяет проект, библиотеки, заголовки?Нет конечно. CMake это сценарий сборки для бедных. Результат работы cmake - будет makefile который уже настоящий сценарий сборки. По правилам записанным в makefile уже будет запускаться компилятор, который произведет объектные файлы. А потом запустится линкер, который уже и соберет из объектных файлов и библиотек исполняемый файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2015, 02:14 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
White Owl, спасибо с cmake-ом уже разобрался. А как тогда из рабочих потоков корректно уведомить GUI чтобы обновить состояние? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2015, 00:36 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_KaWhite Owl, спасибо с cmake-ом уже разобрался. А как тогда из рабочих потоков корректно уведомить GUI чтобы обновить состояние? установить какой то флаг, а в gui потоке его периодически проверять. можно также посылать сообщения или события, но это platform specific. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2015, 09:27 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Вот еще назрел вопрос работы с потоками и синхронизацией их, после "простоты" работы с потоками в 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 для этого примера? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 14:55 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
ошика в new std::thread - происходит утечка памяти. нужно Код: plaintext 1. detach обязательно. или нужно сздать переменную и вызывать join, но толку от потока тогда не будет :) http://en.cppreference.com/w/cpp/thread/thread гуй надо наверное обновлять с мутексами. то есть при любом обращении к гую нужно брать меткс гуя. g++ -std=c++14 your_file.cpp ну или g++ -std=c++11 если gcc о 14 стандарте ничего не знает еще :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 15:19 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
ой, забыл g++ -std=c++14 your_file.cpp -lpthread этот -lpthread нужно когда работаешь с потоками. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 15:21 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
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 мне не нужен т.к. мне надо чтобы у меня потоки "крутились" и основной поток продолжал работу. А как правильно сделать "синхонизированную" функцию чтобы ее и основной поток и рабочие потоки дергали безопасно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 15:47 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_Ka, Знание джавы не освобождает от чтения документации по C++. Конкретно по потокам я бы рекомендовал прочитать эту книжку для начала. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 15:58 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
конечно. а кто скажет компилятору где исходники foo ?? g++ -std=c++11 mainthread.cpp -lpthread в это команду указан только один файл, а хотел вроде два скомпилировать? во втором и находится код foo, но он не добавлен к компиляции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 16:11 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Даже я знаю, что для компиляции четырёх файлов их можно указать в комстроке (да, все) и не морочить(ся) написанием make-файла. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 16:41 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
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() из основного потока а создаваемые потоки не запускаются, почему? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 16:41 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
лучше сразу создать CMakeLists.txt файл. удобнее. там есть find_package (Threads) а к библиотекам исполяемого файла надо добавить ${CMAKE_THREAD_LIBS_INIT} это добавил флаг -lpthread ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 16:48 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_Kaи еще уже конкретный вопрос по этому примеру, вот я компилирую: g++ -std=c++11 -o main mainthread.cpp worker1.cpp -lpthread запускаю ./main и вижу что вызывается только synchCallFromThread() из основного потока а создаваемые потоки не запускаются, почему? На запуск потока требуется время. твой корневой поток заканчивается быстрее чем стартуют создаваемые потоки. для предотврощения этого используется join перед окончанием корневого потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 17:02 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
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) объясните плс. в чем проблема? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 17:15 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
если я правильно понял, переменная ${LIBRARIES} пуста. это пожно проверить так message("my libraries ${LIBRARIES}") при вызове cmake снова, должно отобразиться my libraries [набор_библиотек] вот так должно сработать target_link_libraries (${PROJECT} ${CMAKE_THREAD_LIBS_INIT}) эта переменная - ${CMAKE_THREAD_LIBS_INIT} - становиться доступной после вызова find_package(Threads) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2015, 22:38 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Просто с потоками разобрался кажется. Теперь задача посложнее будет. Надо сделать потоки-классы(как в java) на c++ под линукс. Итак, надо чтобы в основном потоке были 2-е функции которые позволяют основному и рабочим потокам изменять и читать состояние некого объекта(obj) - для этого надо сделать эти функции(или часть кода в них) потокобезопасными, возникают 2 вопроса: 1. как пользоваться мутексами для этого? (или нужно что-то другое?) 2. как написать класс поток? (если это возможно?) //желательно чтобы рабочие потоки ничего не делали пока ожидают смены состояния объекта obj и чтобы основной поток мог уведомить рабочие потоки при смене статуса объекта obj. и еще вопрос, можно-ли в потоке-классе написать функцию которая будет callback если да то как например при наличии 1000 объектов-потоков будет вызываться нужная функция сторонним приложением? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2015, 18:12 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
http://en.cppreference.com/w/cpp/thread Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2015, 18:16 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_KaПросто с потоками разобрался кажется. Теперь задача посложнее будет. Надо сделать потоки-классы(как в java) на c++ под линукс. Итак, надо чтобы в основном потоке были 2-е функции которые позволяют основному и рабочим потокам изменять и читать состояние некого объекта(obj) - для этого надо сделать эти функции(или часть кода в них) потокобезопасными, возникают 2 вопроса: 1. как пользоваться мутексами для этого? (или нужно что-то другое?) 2. как написать класс поток? (если это возможно?) //желательно чтобы рабочие потоки ничего не делали пока ожидают смены состояния объекта obj и чтобы основной поток мог уведомить рабочие потоки при смене статуса объекта obj. и еще вопрос, можно-ли в потоке-классе написать функцию которая будет callback если да то как например при наличии 1000 объектов-потоков будет вызываться нужная функция сторонним приложением? вообще-то в с++ все классы для этого уже есть. ссылку тебе уже дали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2015, 07:51 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
За ссылку спасибо. как "выполнить функцию" в потоке понятно, а вот как свой класс-поток создать еще нет, так что пока разбираюсь если кто поделился бы примером то было бы очень кстати. И вопрос про callback функции остается, можно-ли сделать так чтобы стороннее приложение вызывало функцию объекта? (не просто функцию и не статическую функцию) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2015, 19:45 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_Kaкак свой класс-поток создать еще нет И не будет. Потому что не бывает в природе "класс-потоков". Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2015, 19:52 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_KaЗа ссылку спасибо. как "выполнить функцию" в потоке понятно, а вот как свой класс-поток создать еще нет, так что пока разбираюсь если кто поделился бы примером то было бы очень кстати. Что ты понимаешь под "класс-поток" ? Поток это функция, как завершилась - так завершился поток. Если вопрос стоит как работать с объектом в отдельном потоке, то передаешь указатель на объект в параметрах. Alex_KaИ вопрос про callback функции остается, можно-ли сделать так чтобы стороннее приложение вызывало функцию объекта? (не просто функцию и не статическую функцию) Что значит "стороннее приложение" ? Поконкретнее распиши что там у тебя происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2015, 20:00 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_KaИ вопрос про callback функции остается, можно-ли сделать так чтобы стороннее приложение вызывало функцию объекта? (не просто функцию и не статическую функцию) Что такое стороннее приложение не знаю, но колбэк из объектной функции создается и вызывается так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. И естественно, если вы передаете колбэк в поток, то вы должны гарантировать что объект для которого он вызывается будет существовать в момент вызова из потока. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2015, 22:44 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
спасибо за ответы. вот еще вопросы возникли, создаю я класс(примерно такой): Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. как мне сделать стобы функция runner() вызывалась в потоке? пытаюсь так, но не получается(ошибка: нет подходящей функции для вызова...) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. надо ли мне в деструкторе освобождать память? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2016, 17:56 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_Kaнадо ли мне в деструкторе освобождать память?Восходит ли солнце на востоке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2016, 18:12 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
:) а как мне тут: std::thread myThread(userDataWorker.runner ); правильно вызвать мою функцию в потоке? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2016, 18:16 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Alex_Ka:) а как мне тут: std::thread myThread(userDataWorker.runner ); правильно вызвать мою функцию в потоке? http://en.cppreference.com/w/cpp/thread/thread/thread ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.01.2016, 18:23 |
|
||
|
Linux: C++, GUI, thread
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. Вот мой тестовый код, он рабочий, но по нему есть вопросы, ответьте кто знает плс. : 1. при вызове stop_thread из основного потока переменная stopThread не изменяется, хотя объявлена volatile почему? как сделать чтобы она изменялать? только через указатели? 2. как мне правильно освобождать память в деструкторе? 3. как мне использовать статическую переменную для подсчета созданных объектов? и вобще статические переменные как им задавать значения кроме конструктора? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.01.2016, 18:29 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2018643]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
157ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 294ms |
| total: | 560ms |

| 0 / 0 |
