Форум программистов, компьютерный форум, киберфорум
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
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
25.06.2012, 09:16
Студворк — интернет-сервис помощи студентам
В этом случае варианта два: попроще - TThread + Synchronize(), позаковыристей - вывод информации в глобальную AnsiString через крит-секцию и копирование информации из нее, скажем, таймером в основном потоке.

... ну, лучше-таки TThread.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
25.06.2012, 09:22  [ТС]
BRcr, а как это на примере может выглядеть?)) TThread + Synchronize()
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
25.06.2012, 09:42
Так может: ThreadSynchronize (C++)
И так тоже: TThreadYield (C++)
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
25.06.2012, 09:53  [ТС]
BRcr, первый пример вроде попроще) попробую разобраться, но щас пока нужно думаю сначала отладить зависание)

от сюда вопрос, как можно проверить какой цикл виснет, с помощью трассировки, но после закрытия программы?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
25.06.2012, 10:29
А почему после-то? Программа и не должна завершаться до тех пор, пока порожденные ей потоки не будут разрушены. Спокойненько себе расставляем breakpoints после циклов и ключевых действий, потом смотрим, до какой дело так и не дойдет.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
25.06.2012, 12:15  [ТС]
BRcr, не, это то понятно что она не должна завершаться, но мне ведь по сути нужно начать ловить когда я пытаюсь закрыть программу, а до этого она должна как я понимаю нормально запуститься, и проработать хотя бы несколько секунд
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
25.06.2012, 12:22
И где проблема? Ставим breakpoint тут:
C++
1
StopThread_harvest = true;
Закрываем программу - точка срабатывает, программа на паузе. Расставляем breakpoints в потоке и продолжаем выполнение. Никаких преждевременных срабатываний.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
25.06.2012, 12:37  [ТС]
проблема в том что:

C++
1
2
3
4
5
6
7
8
9
try
        {
                EnterCriticalSection(section_harvest); // <--- программа виснет тут
                StopThread_harvest = true;  // соответственно до сюда дело и не доходит
        }
        __finally
        {
                LeaveCriticalSection(section_harvest);
        }
а если поставить точку на EnterCriticalSection(section_harvest);

то в отладчик выходит программа, но когда расставляю точки в потоке то по F8 отладчик делает следующий шаг к StopThread_harvest = true;
и виснет, не переходя к остальным точкам в потоке
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
25.06.2012, 12:49
Сам отладчик виснет? Билдер? Или только программа?
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
25.06.2012, 12:52  [ТС]
программа, т.е. когда нажимаю F8 программа виснет, по Ctrl+F2 закрываю программу без проблем.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
25.06.2012, 13:39
Есть еще очень хороший способ отладки потоков - логирование. После подозрительных действий писать в лог, мол, действие свершено. Можно к этому еще добавлять значения каких-то переменных или штамп времени.
Все, потом смотрим лог и видим, где сбои.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
26.06.2012, 11:14  [ТС]
BRcr, я логи ни когда не писал еще)) как это делается ? на примере если можно))

Добавлено через 19 часов 54 минуты
BRcr, с логами разобрался) простая оказалась задачка)

но выяснить из за чего именно виснет не получается, программа зависает сразу после обращения к

EnterCriticalSection(section_harvest);

после чего запись в лог тоже прекращается

Добавлено через 1 час 18 минут
Я нашел проблему))) и она как раз связана с тем что вы говорили раньше про использование VCL в потоке

всего лишь за комментировал строку :

C++
1
formMain->editCurrent->Text = str + " a/n";
и программа стала закрываться, и return нормально возвращает ))
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
26.06.2012, 12:45
Так вот они какие, три сосны! А сколько вокруг-то бродили...
Кстати, ситуация разрешилась в полнейшем соответствии с твоей подписью.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
26.06.2012, 13:32  [ТС]
BRcr, это точно))) вот только теперь нужно научиться пользоваться синхронизацией)

Добавлено через 26 минут
не совсем понимаю, что да как в этом примере : http://docwiki.embarcadero.com... _(C%2B%2B)
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
26.06.2012, 13:41
А чего неясно-то?
Execute() - основная функция потока, содержит его цикл.
Synchronize() - принимает ссылки на функции и выполняет их в контексте основного потока процесса. Функции должны быть без параметров - при необходимости передавать им что-то можно глобальными переменными или данными класса.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
26.06.2012, 13:44  [ТС]
BRcr, а что это за функции ?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
__fastcall TEnumeratorThread::TEnumeratorThread(TMemo* Memo)
    : TThread(true)
{
    /* Initialize internal fields */
    m_Memo = Memo;
    m_CurrNbr = 0;
    m_Stop = 0;
}
 
.................
 
void __fastcall TEnumeratorThread::GentleStop()
{
  /* Set the flag to 1. */
  InterlockedIncrement(&m_Stop);
 
  /* Wait for this thread to finish executing */
  this->WaitFor();
}
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
26.06.2012, 14:15
Первая - конструктор класса потока, вторая - его метод. Классы потоков обычно наследуют от TThread и добавляют в них по вкусу данные и методы. Примерно так же, как обычно с формами работают. В данном случае имя класса потока - TEnumeratorThread.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
26.06.2012, 14:16  [ТС]
Ну т.е. мне это это по сути не нужно?
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
26.06.2012, 14:54
Конкретно то, что в примере - нет. Нужен отдельный метод, в котором будет обращение к formMain->editCurrent->Text.
0
Техник
 Аватар для DenProx
318 / 176 / 27
Регистрация: 09.10.2009
Сообщений: 3,109
26.06.2012, 14:56  [ТС]
как все сложно)) завтра буду пробовать )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.06.2012, 14:56

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

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

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

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

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


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

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