Форум программистов, компьютерный форум, киберфорум
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
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
02.09.2012, 20:24
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Avazart Посмотреть сообщение
1. Не использовать FreeOnTerminate= true;
Походу остается этот, потому что другие варианты не работают

Добавлено через 16 минут
Проверил - оказывается и при FreeOnTerminate=false; поток освобождает память, когда заканчивает работу.
Тогда мне не ясно зачем нужен вообще этот FreeOnTerminate...

Добавлено через 2 минуты
хотя нет, ошибка, поток заканчивает работу, но не освобождает память... и как теперь проверять когда поток закончил работу...тратить на это время основного потока
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
02.09.2012, 20:48
А как-то так ?
C++
1
2
3
4
5
6
7
8
9
10
11
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
if( MyThread1 )
  {
   CanClose= false;
   if(  MyThread1->Finished ) CanClose= true;
   else  ShowMessage("Подождите завершения загрузки");
  }
}
//---------------------------------------------------------------------------
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
03.09.2012, 13:26
Цитата Сообщение от Avazart Посмотреть сообщение
А как-то так ?
C++
1
2
3
4
5
6
7
8
9
10
11
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
if( MyThread1 )
  {
   CanClose= false;
   if(  MyThread1->Finished ) CanClose= true;
   else  ShowMessage("Подождите завершения загрузки");
  }
}
//---------------------------------------------------------------------------
Не, мне надо, чтобы когда поток закончил выполнять свое дело - сам закрылся/самоуничтожился, т.е. чтобы прям во время работы программы, а не во время выхода - этим и хорош FreeOnTerminate...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
03.09.2012, 17:56
Ну так в чем проблема?

Объявите в форме переменную bool ThFinished; и синхронизируте к ней доступ например через критическую секцию как из потока так и из формы
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
06.09.2012, 20:34
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так в чем проблема?

Объявите в форме переменную bool ThFinished; и синхронизируте к ней доступ например через критическую секцию как из потока так и из формы
И как часто из формы проверять эту переменную? это ж надо обращаться к ней из формы...

Тут скорее всего надо что-то наподобии Event'ов. Когда я делаю так:
C++
1
2
3
4
5
6
7
__fastcall TForm1::Term(TObject *Sender);
{
delete MyThread;
}
 
//...
MyThread->OnTerminate = Term;
Все виснет к ёжику!
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.09.2012, 20:37
И как часто из формы проверять эту переменную?
Когда надо тогда и проверяте...
это ж надо обращаться к ней из формы...
А в чем проблема ?
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
06.09.2012, 20:52
Цитата Сообщение от Avazart Посмотреть сообщение
Когда надо тогда и проверяте...

А в чем проблема ?
В том и проблема, что я не понимаю как.
Покажите пример

Добавлено через 6 минут
Вот так работает при FreeOnTerminate=true

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
    if (T_HTTP) {
        T_HTTP->Terminate();
        Form1->Memo1->Lines->Add("вызвали!");
    }
    //WaitForSingleObject(hThread,500);
    //Sleep(0);
 
 
    DWORD Code;
    while (GetExitCodeThread(hThread,&Code) && (Code== STILL_ACTIVE))
    {
    Form1->Memo1->Lines->Add("Still active!");
    Application->ProcessMessages();
    }
    Form1->Memo1->Lines->Add("Потока нет!");
    //CanClose=false;
    Form1->Memo1->Lines->Add("FormCloseQuery!");
}
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
06.09.2012, 23:05
Как то так ...
Вложения
Тип файла: rar Thread And TCriticalSection.rar (284.8 Кб, 14 просмотров)
1
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
07.09.2012, 15:55
Цитата Сообщение от Avazart Посмотреть сообщение
Как то так ...
Но ведь поток уничтожается только после нажатия на button2. Если на кнопку не нажать - поток будет жив, хоть и окончен.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.09.2012, 19:07
Так что проблема в переносе кода из кнопки ?
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
08.09.2012, 13:58
Цитата Сообщение от Avazart Посмотреть сообщение
Так что проблема в переносе кода из кнопки ?
Суть в том, что поток должен убиться, когда закончится, а не когда я нажму кнопку или выполню какое-то действие. Грубо говоря я запустил программу, запустил поток и ушел пить чай. Когда вернусь, поток должен закончиться и освободить память сам, т.е. без моего вмешательства - FreeOnTerminate=true так и делает. Но если я перенесу код из кнопки куда-либо, то это значит мое вмешательство все же необходимо.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
08.09.2012, 18:31
т.е. без моего вмешательства - FreeOnTerminate=true так и делает.
Ну так в чем проблема ?
Используйте FreeOnTerminate= true;
0
 Аватар для ExeiLj
13 / 13 / 3
Регистрация: 02.08.2012
Сообщений: 128
09.09.2012, 21:59
Цитата Сообщение от Avazart Посмотреть сообщение
Ну так в чем проблема ?
Используйте FreeOnTerminate= true;
Ну сейчас проблем уже нет

Цитата Сообщение от ExeiLj Посмотреть сообщение
Вот так работает при FreeOnTerminate=true

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::FormCloseQuery(TObject *Sender, bool &CanClose)
{
    if (MyThread) {
        MyThread->Terminate();
        Form1->Memo1->Lines->Add("вызвали!");
    }
 
 
    DWORD Code;
    while (GetExitCodeThread(hThread,&Code) && (Code== STILL_ACTIVE))
    {
    Form1->Memo1->Lines->Add("Still active!");
    Application->ProcessMessages();//Вот этот кусок кода важен
    }
    Form1->Memo1->Lines->Add("Потока нет!");
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.09.2012, 21:59

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
93
Ответ Создать тему
Новые блоги и статьи
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