Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/63: Рейтинг темы: голосов - 63, средняя оценка - 4.94
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109

Многопоточные приложения (остановить поток)

21.06.2012, 14:57. Показов 13230. Ответов 92
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток. У меня такая проблемка, программа включается в себя 2 дополнительных потока, которые создаются при старте проги:

C++
1
2
3
4
........
        hThread = CreateThread(NULL,0,&ServiceThread,0,0,&idThread);
        hThread_shim = CreateThread(NULL,0,&ShimProc,0,0,&idThread_shim);
........
все работает. Но при попытке закрыть программу, она зависает мертвым грузом ...

на событии OnClose стоит такой код:

C++
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
try
        {
                EnterCriticalSection(section_harvest);
                StopThread_harvest = true;
        }
        __finally
        {
                LeaveCriticalSection(section_harvest);
        }
 
        try
        {
                EnterCriticalSection(section);
                stop_shim = true;
        }
        __finally
        {
                LeaveCriticalSection(section);
        }
        //CloseHandle(hThread);
 
        DWORD exitCode;
        do
        {
                GetExitCodeThread(hThread,&exitCode);
        }
        while(exitCode == STILL_ACTIVE);
 
     .................
 
        WaitForSingleObject(Handle,200);

почему может зависать? и как корректно завершить выполнение потоков и вообще программы с несколькими потоками?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
21.06.2012, 14:57
Ответы с готовыми решениями:

Многопоточные приложения
Создайте приложение, которое в фоновом режиме проверяет правильно введенные числа. На главной форме разместите два многострочных редактора....

Многопоточные приложения
Доброго времени суток всем! Кто-нибудь может дать дельные ссылки на информацию/исходник по многопоточным приложениям?

Многопоточные приложения
Помогите пожалуйста написать такую программу Создать многопоточное приложение, в котором поток родитель создает файл и создает три...

92
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
28.06.2012, 10:08  [ТС]
Студворк — интернет-сервис помощи студентам
Временно решил использовать Timer т.к. он ранее уже был для этих целей в программе задействован) как разберусь с синхронизацией, переделаю все )) а то программа работает не стабильно, после примерно часов 5 непрерывной работы, закрывается с критической ошибкой
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
01.09.2012, 01:28
То есть при закрытии приложения(формы) необходимо завершать все потоки? разве они сами не закроются?
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
01.09.2012, 14:05  [ТС]
ExeiLj, нет, если их не завершить они так и будут сидеть в памяти
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
01.09.2012, 15:41
Цитата Сообщение от DenProx Посмотреть сообщение
ExeiLj, нет, если их не завершить они так и будут сидеть в памяти
Теперь у меня серьезная паранойя на программы от быдлокодеров))))

А как сделать завершение потока при закрытии?
Я навешал на весь поток проверки на Terminated и при закрытии делаю MyThread->Terminate(); но надо же выставить ожидание... как корректно сделать?

Писал WaitForSingleObject(hThread,5000); и при закрытии он виснет на 5 секунд, хотя я знаю, что поток завершается меньше, чем за секунду...


P.S.: если запустить вечноцикличный поток и закрыть программу, то поток останется в памяти. Но будет ли он выполняться? т.е. помимо памяти будет ли он загружать процессор?
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
01.09.2012, 15:45  [ТС]
ExeiLj, я сам точно не знаю) их несколько способов ...
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
01.09.2012, 15:54
Цитата Сообщение от ExeiLj Посмотреть сообщение
Писал при закрытии WaitForSingleObject(hThread,5000); и когда закрываю он виснет на 5 секунд, хотя я знаю, что поток завершается меньше, чем за секунду...
Относительно WaitForSingleObject я его вообще правильно применяю, или я не правильно понял его действие? разве это не ожидание пока завершится поток, который мы спрашиваем?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2012, 17:12
ExeiLj, нет, если их не завершить они так и будут сидеть в памяти
Класса TThread это не касается, покрайней мере не должно касаться, там должен сделать все деструктор...

И теоритически ОС должна сама почистить память после завершения работы программы
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
01.09.2012, 17:57
Цитата Сообщение от Avazart Посмотреть сообщение
Класса TThread это не касается, покрайней мере не должно касаться, там должен сделать все деструктор...
Запускаю поток, в котором начинается скачиваться страница и тут же закрываю программу - вылетает ошибка EIdSocketError, что как бы намекает - поток работает, а все с чем он должен работать мы уничтожили...

Добавлено через 16 минут
Если я выполняю этот код
C++
1
2
3
4
5
6
7
    T_HTTP->Terminate(); //Сообщаем, что потоку пора вернуться откуда пришел, например, в ад
    Sleep(1000); //не будем его беспокоить секунду
    DWORD Code;
    while (GetExitCodeThread(Form1->hThread,&Code) && (Code == STILL_ACTIVE)) {
     Form1->Memo1->Lines->Add("Still active!"); //Будет писать "Still active!" пока поток жив
     }
    Form1->Memo1->Lines->Add("Terminated!"); //Сообщит, что потока уже нет
на кнопке - все работает и через секунду поток уже "Terminated".
Если я сую этот код в OnClose, то у меня постоянно пишет "Still Active"...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2012, 18:16
C++
1
GetExitCodeThread(Form1->hThread,&Code)
Эта ф-ция может возвратить ошибку но это не значит что что поток еще вработе...

OnClose проиходит до выполнения деструктора формы...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
01.09.2012, 18:28
Цитата Сообщение от ExeiLj Посмотреть сообщение
P.S.: если запустить вечноцикличный поток и закрыть программу, то поток останется в памяти. Но будет ли он выполняться? т.е. помимо памяти будет ли он загружать процессор?
Цитата Сообщение от Avazart Посмотреть сообщение
Класса TThread это не касается, покрайней мере не должно касаться, там должен сделать все деструктор...
Полюбопытствуйте. Сделайте пару потоков - один через CreateThread(), другой - через TThread. Заставьте их делать ShowMessage() каждые 10 секунд и закройте программу, не закрывая потоки и не освобождая память.
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
01.09.2012, 18:36
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
GetExitCodeThread(Form1->hThread,&Code)
Эта ф-ция может возвратить ошибку но это не значит что что поток еще вработе...
У меня идет проверка "активно ли"
C++
1
GetExitCodeThread(Form1->hThread,&Code) && (Code == STILL_ACTIVE)
если функция возвращает ошибку, то это условие не срабатывает. Функция не может возвращать "Активно" когда ей взблагоразумится. А значит поток таки еще жив...


Цитата Сообщение от Avazart Посмотреть сообщение
OnClose проиходит до выполнения деструктора формы...
Ну...да...как это связано с тем, что на кнопке работает, а на OnClose - нет?

Добавлено через 6 минут
Цитата Сообщение от BRcr Посмотреть сообщение
Полюбопытствуйте. Сделайте пару потоков - один через CreateThread(), другой - через TThread. Заставьте их делать ShowMessage() каждые 10 секунд и закройте программу, не закрывая потоки и не освобождая память.
А если вы просто скажите разницу Я не умею делать потоки напрямую через WinAPI (CreateThread()), но знаю что у ВинАпи есть ньюансы, такие как ExitThread и CloseHandle...

А насчет TThread - при закрытие программы СМСки не показываются, но это еще не значит, что поток освободил память (как и при принудительном TerminateThread память не освобождается).
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2012, 18:44
не закрывая потоки и не освобождая память.
Т.е?
Я говорил про деструктор... а его вызвать можно только delete
При чем нужно предусмотреть "мягкое" завершение, если поток в слипе или в безконечном цикле ясное дело его не завершить
без грубого TerminateThread()

Добавлено через 7 минут
Такой код останавливает периодическую запись в файл при удалении потока так что файле оказывается только первая запись "0"
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
using namespace std;
 
int i=0;
while(! Terminated)
 {
    ofstream ofs;
    ofs.open("log.txt",ios::app);
    if(ofs) ofs<<i<<endl;
    ofs.close();
 
    i++;
    Sleep(10000);
 }
}
//---------------------------------------------------------------------------
C++
1
2
3
4
5
6
7
8
9
10
TMyThread* Thread1;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Thread1 = new TMyThread(false);
Sleep(5000);
 
delete Thread1;  //Thread1->Terminate();
}
//---------------------------------------------------------------------------
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
01.09.2012, 19:26
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
TMyThread* Thread1;
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Thread1 = new TMyThread(false);
Sleep(5000);
 
delete Thread1;  //Thread1->Terminate();
}
//---------------------------------------------------------------------------
Вот тут https://forums.embarcadero.com... &tstart=-1
Написано, что надо делать так:

C++
1
2
3
4
5
6
7
    if( MyThr )
    {
        MyThr->Terminate();
        MyThr->WaitFor();
        delete MyThr;
        MyThr = NULL
    }
Иначе, полагаю, не произойдет должного высвобождения ресурсов. НО MyThr->WaitFor(); у меня вызывает ошибку "Неправильный деструктор"...
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
01.09.2012, 19:39
Цитата Сообщение от ExeiLj Посмотреть сообщение
НО MyThr->WaitFor(); у меня вызывает ошибку "Неправильный деструктор"...
Лучше приводи полный текст ошибок. А по теме - скорее всего FreeOnTerminate установлен в true, следовательно, на момент вызова WaitFor() объект уже разрушен и ссылка некорректна.
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
01.09.2012, 19:43
Цитата Сообщение от BRcr Посмотреть сообщение
Лучше приводи полный текст ошибок. А по теме - скорее всего FreeOnTerminate установлен в true, следовательно, на момент вызова WaitFor() объект уже разрушен и ссылка некорректна.
Да, в true. Я как раз и хотел чтобы он ждал пока разрушится, а если разрушено, чтобы ничего не ждал...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2012, 19:49
Вот тут https://forums.embarcadero.com... &tstart=-1
Написано, что надо делать так:
Да согласен, поток должен закончиться до того как данные потока будут уничтожены ( в том числе и FTerminated)
А в деструкторе может быть это не предусмотренно...
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
01.09.2012, 20:25
Цитата Сообщение от BRcr Посмотреть сообщение
Лучше приводи полный текст ошибок. А по теме - скорее всего FreeOnTerminate установлен в true, следовательно, на момент вызова WaitFor() объект уже разрушен и ссылка некорректна.
Если делать так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void __fastcall TForm1::CloseForms(TObject *Sender, TCloseAction &Action)
{
    T_HTTP->Terminate(); //Сообщаем о завершение потока
    T_HTTP->WaitFor(); // Ждем завершения
    Form1->Memo1->Lines->Add("Done"); //Сообщаем, что поток завершился
    DWORD Code;
    while (GetExitCodeThread(Form1->hThread,&Code) && (Code == STILL_ACTIVE)) { //Проверяем, правда ли он завершился
     Form1->Memo1->Lines->Add("Still active!");
     }
    Form1->Memo1->Lines->Add("Terminated!");
    delete T_HTTP; //Очищаем память
    Sleep(1000); //дадим секунду, чтобы прочитать текст, для отладки
    Action = caFree;
}
Все ок - поток сам прекращается и приложение закрывается, но как делать с FreeOnTerminate = true... ?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2012, 20:39
Убрать
C++
1
 delete T_HTTP;
Добавлено через 11 минут
Никто не встречал исходники TThread ? А то как то надоело гадать хотелось бы заглянуть в pas-файл ...
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
01.09.2012, 21:06
Цитата Сообщение от Avazart Посмотреть сообщение
Убрать
C++
1
 delete T_HTTP;
если убрать и сделать FreeOnTerminate=true;
Цитата Сообщение от ExeiLj Посмотреть сообщение
MyThr->WaitFor(); у меня вызывает ошибку "Неправильный деструктор"...
Если точнее, то: First chance exception at $75B9B9BC. Exception class EThread with message 'Thread Error: Неверный дескриптор (6)'. Process Project1.exe (61336)


Цитата Сообщение от Avazart Посмотреть сообщение
Никто не встречал исходники TThread ? А то как то надоело гадать хотелось бы заглянуть в pas-файл ...
C:\Program Files (x86)\Embarcadero\RAD Studio\9.0\source\rtl\common\System.Clas ses.pas <- там
1
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
01.09.2012, 21:08
Ну логично что и MyThr->WaitFor(); тоже нужно убрать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.09.2012, 21:08

Многопоточные консольные приложения
подскажите сайт\книжку где почитать (обязательно с примерами) про многопоточные приложения, и только с консольными примерами. в этой...

Как проще проектировать многопоточные или асинхронные приложения?
Доброе утро! Подскажите, пожалуйста, какая есть документация на эту тему?

Как писать многопоточные приложения, использующие разделяемые ресурсы
Здравствуйте. Возможно, у кого-либо найдется время, чтобы показать, как писать многопоточные приложения, использующие разделяемые...

Остановить поток
Есть 3 потока 1-главный он отвечает за выполнение 2 и 3 потока нужно: 1 поток сотановился и запустил 2 поток, 2 поток выполнил свое...

Остановить поток
Помогите пожалуйста создать кнопку, нажав на которую можно было бы остановить поток.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru