powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Linux: C++, GUI, thread
35 сообщений из 35, показаны все 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
Linux: C++, GUI, thread
    #39138769
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_KaПросто с потоками разобрался кажется. Теперь задача посложнее будет.
Надо сделать потоки-классы(как в java) на c++ под линукс.

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

и еще вопрос, можно-ли в потоке-классе написать функцию которая будет callback если да то как например при наличии 1000 объектов-потоков будет вызываться нужная функция сторонним приложением?

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

И вопрос про callback функции остается, можно-ли сделать так чтобы стороннее приложение вызывало функцию объекта? (не просто функцию и не статическую функцию)
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39138904
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Kaкак свой класс-поток создать еще нет
И не будет. Потому что не бывает в природе "класс-потоков".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39138907
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_KaЗа ссылку спасибо.
как "выполнить функцию" в потоке понятно, а вот как свой класс-поток создать еще нет, так что пока разбираюсь если кто поделился бы примером то было бы очень кстати.
Что ты понимаешь под "класс-поток" ? Поток это функция, как завершилась - так завершился поток.

Если вопрос стоит как работать с объектом в отдельном потоке, то передаешь указатель на объект в параметрах.

Alex_KaИ вопрос про callback функции остается, можно-ли сделать так чтобы стороннее приложение вызывало функцию объекта? (не просто функцию и не статическую функцию)
Что значит "стороннее приложение" ? Поконкретнее распиши что там у тебя происходит.
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39138963
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_KaИ вопрос про callback функции остается, можно-ли сделать так чтобы стороннее приложение вызывало функцию объекта? (не просто функцию и не статическую функцию)

Что такое стороннее приложение не знаю, но колбэк из объектной функции создается и вызывается так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
class A {
  public:
  void callback(int arg);
};
A a;

auto fn = std::bind(&A::callback, &a, 123);
fn();



И естественно, если вы передаете колбэк в поток, то вы должны гарантировать что объект для которого он вызывается будет существовать в момент вызова из потока.
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39142057
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо за ответы.
вот еще вопросы возникли, создаю я класс(примерно такой):
Код: 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.
//userdataworker.h
#ifndef USERDATAWORKER_H_
#define USERDATAWORKER_H_

#pragma once /* Защита от двойного подключения заголовочного файла */
#include <string>

class UserDataWorker{

  private:
    char* ClientCode;
    int Port;
    int Num;
    double LLevel;

  public:
    UserDataWorker(/*char*/const char* ClientCode, int Port, int Num, double LLevel);
    ~UserDataWorker();

    void getStateUserData(char* _ClientCode, int* _Port, int* _Num, double* _LLevel);
    void printStateUserData();
    int runner();
    int serviceCallback();
};
#endif /* USERDATAWORKER_H_ */



Код: 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.
// userdataworker.cpp
#include "userdataworker.h"
#include <string>
#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

UserDataWorker::UserDataWorker(/*char*/const char* _ClientCode, int _Port, int _Num, double _LLevel)
{
  //cout << "UserData_CONSTRUCTOR in param _ClientCode:" << _ClientCode << " port: " << _Port << " num: " << _Num << " l: " << _LLevel << endl;

  ClientCode = new char[sizeof(_ClientCode)];
  strcpy(ClientCode, _ClientCode);
  Port = _Port;
  Num = _Num;
  LLevel = _LLevel;
  std::cout << "UserData_CONSTRUCTOR_ClientCode: " << ClientCode << " Port: "
         << Port << " Num: " << Num << " LLevel: " << LLevel << std::endl;
}

UserDataWorker::~UserDataWorker()
{
    cout << "UserData_destructor. ClientCode:" << ClientCode << endl;
    //delete []ClientCode; //надо освобождать память?
}

void UserDataWorker::getStateUserData(char* _ClientCode, int* _Port, int* _Num, double* _LLevel)
{
  strcpy(_ClientCode, ClientCode);
  _Port = &Port;
  _Num = &Num;
  _LLevel = &LLevel;
}

void UserDataWorker::printStateUserData()
{
  std::cout << "printStateUserData ClientCode: " << ClientCode << " Port: "
         << Port << " Num: " << Num << " LLevel: "
         << LLevel << std::endl;
}

int UserDataWorker::runner()
{
  //что-то делаем в потоке.
  return 0;
}

int UserDataWorker::serviceCallback()
{
    //вызов из вне
}



как мне сделать стобы функция runner() вызывалась в потоке?
пытаюсь так, но не получается(ошибка: нет подходящей функции для вызова...)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
int main(int argc, char* argv[])
{
	for ( int idx = 0; idx < 10; ++idx )
	{
		std::stringstream ss;
		ss << "thread_" << idx;

		UserDataWorker userDataWorker(ss.str().c_str(), 3000 + idx, 10 * idx, 0.5 + idx);

		std::thread myThread(userDataWorker.runner );
		myThread.detach();
		//std::thread(userDataWorker.runner ).detach();
	} 
  return 0;
}



надо ли мне в деструкторе освобождать память?
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39142064
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Kaнадо ли мне в деструкторе освобождать память?Восходит ли солнце на востоке?
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39142069
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
:)

а как мне тут:
std::thread myThread(userDataWorker.runner );
правильно вызвать мою функцию в потоке?
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39142072
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ka:)

а как мне тут:
std::thread myThread(userDataWorker.runner );
правильно вызвать мою функцию в потоке? http://en.cppreference.com/w/cpp/thread/thread/thread
...
Рейтинг: 0 / 0
Linux: C++, GUI, thread
    #39146718
Alex_Ka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
#include <thread>
#include <string>
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <ctime>
#include <chrono>
#include <sstream>

long any_var = 1234;
double any_ln = 1001.01010111;

class MyThread{ 
private:
  char* ClientCode;
  int id;
  long userID;
  volatile bool stopThread;
  double *LnValue;
  long *var;
  long counter;
  volatile long c2;
  //static long s = 0;
  
public:
  MyThread(const char* _ClientCode, int param_id, long param_userID, double *_LnValue, long *_var) 
  : id(param_id)
  , userID(param_userID)
  , LnValue(_LnValue)
  , var(_var)
  , counter(0)
  , c2(0)
  , stopThread(false)
  {
    ClientCode = new char[sizeof(_ClientCode) + 1];
    strcpy(ClientCode, _ClientCode); 
  }

  ~MyThread()
  {
    //delete []ClientCode;
    //delete ClientCode;
    //delete &ClientCode;
    //delete *ClientCode;
  } 
  
  void run_thread() //volatile
  {
    counter = (id+1) * 1000000000;
  	while(!stopThread && *var != -1)
  	{
	  counter++;
  	std::cout << "THREAD : " << id << " userID: " << userID << " T_ID: " << std::this_thread::get_id() << " ClientCode: " << ClientCode << " stopThread: " << stopThread << " var: " << *var << " LnValue: " << *LnValue << " c= " << counter << " c2= " << c2  << std::endl;
		//DO ANY LOGIC IN THREAD
  		std::this_thread::yield();
		std::this_thread::sleep_for(std::chrono::microseconds(700));
		c2++;
  	}
  }
  
  void stop_thread()
  {
  	stopThread = true;
	std::cout << "stop_thread_THREAD : " << id << " userID: " << userID << " T_ID: " << std::this_thread::get_id() << " ClientCode: " << ClientCode << " stopThread: " << stopThread << " c2= " << c2 << std::endl;
  } 
    
};
 
int main(int argc, char* argv[]){
 
std::vector<MyThread> threads;
int treads_num = 5;

for ( int num = 0; num < treads_num; num++ )
{
	std::stringstream ss;
	ss << "thread_" << num;
		
	MyThread t(ss.str().c_str(), num, num * 1000, &any_ln, &any_var);

	std::thread my_thread(&MyThread::run_thread, t);
		
	my_thread.detach();
		
	threads.push_back( t );
}

    std::this_thread::sleep_for(std::chrono::milliseconds(50));

for (int m=0; m<threads.size(); m++)
{
  threads.at(m).stop_thread();
}  
 
any_var = -1; 
 
std::this_thread::sleep_for(std::chrono::milliseconds(50));
std::cout << "MAIN_THREAD FINISH" << std::endl;

return 0;
}


Вот мой тестовый код, он рабочий, но по нему есть вопросы, ответьте кто знает плс. :
1. при вызове stop_thread из основного потока переменная stopThread не изменяется, хотя объявлена volatile почему?
как сделать чтобы она изменялать? только через указатели?
2. как мне правильно освобождать память в деструкторе?
3. как мне использовать статическую переменную для подсчета созданных объектов? и вобще статические переменные как им задавать значения кроме конструктора?
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Linux: C++, GUI, thread
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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