Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 585

Выйти из приложения внутри потока

23.02.2013, 22:18. Показов 1374. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс потока:
C++
1
2
3
4
5
6
7
8
9
10
11
class TMyThread : public TThread
{                                       
private:
      // Private declarations
protected:
      void __fastcall Execute();
public:
    __fastcall TMyThread( bool _suspended )
                   : TThread( _suspended ) {};
 
};
При создании главной формы запускаю поток:
C++
1
2
3
4
    TMyThread *MyThread = new TMyThread(true);
    MyThread->FreeOnTerminate = true;
    MyThread->Priority = tpLower; // Приоритет низкий
    MyThread->Resume(); // Запускаем поток
В самом потоке:
C++
1
2
3
4
5
6
7
8
9
10
11
12
void __fastcall TMyThread::Execute()      
{   
   while (1)
   {
    Sleep(500);
        if (условие, которое точно выполняется)
        {  
                ShowMessage("MyError");
               Application->Terminate();  
        }
   }
}
Так вот: при Terminate(); программа закрывается не полностью, продолжает работать поток, и этот самый Terminate() так и вызывается до бесконечнсти с периодом в полсекунды. Что я делаю не так?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.02.2013, 22:18
Ответы с готовыми решениями:

Обработка запроса на остановку потока внутри этого потока
Нужно обрабатывать запрос на остановку потока внутри самого потока. Вопрос - как это записать?

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

Остановить socket.Accept() внутри блока while который находится внутри потока
Сам код using System; using System.IO; using System.Collections.Generic; using System.ComponentModel; using System.Data; using...

8
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.02.2013, 00:45
Закрывай в методе, а метод вызывай через Syncronize(), ну и после из цикла while(1) выйди...
0
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 585
24.02.2013, 11:03  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
ну и после из цикла while(1) выйди...
Само по себе это не помогает... в сочетании с первой рекомендацией - попробую.
Цитата Сообщение от Avazart Посмотреть сообщение
Закрывай в методе, а метод вызывай через Syncronize(),
Не совсем понял, как именно, это нужно организовать. Был бы очень благодарен, если бы Вы внесли поправки в код выше. На примере я быстро понимаю.

Добавлено через 29 минут
C++
1
2
3
4
5
6
  if (условие, которое точно выполняется)
        {  
                ShowMessage("MyError");
                this->Terminate();  
                break;
        }
Так, например, удается выйти из потока. Как при этом (при завершении TMyThread::Execute или при уничтожении потока) выйти из приложения?

Добавлено через 2 минуты
Интересно откуда вообще такие ограничения и неработоспособность
C++
1
Application->Terminate();
внутри потока?
0
40 / 25 / 7
Регистрация: 04.10.2012
Сообщений: 127
24.02.2013, 12:01
UnitThread.h
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
//-------------------------------------------------------------------------------------------------
#ifndef UnitThreadH
#define UnitThreadH
//-------------------------------------------------------------------------------------------------
#include <Classes.hpp>
//-------------------------------------------------------------------------------------------------
#include <vcl>
#pragma hdrstop
#pragma package(smart_init)
//-------------------------------------------------------------------------------------------------
class ThreadWorkSample : public TThread
{
private:
             short  NumRead;
   void __fastcall  NumWrite(short X);
   void __fastcall  Result();
protected:
   void __fastcall  Execute();
public:
   ThreadWorkSample(bool CreateSuspended);
   __property short Number = {read = NumRead, write = NumWrite};
};
//-------------------------------------------------------------------------------------------------
#endif
UnitThread.cpp
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
//-------------------------------------------------------------------------------------------------
#include "UnitMain.h"
#include "UnitThread.h"
//-------------------------------------------------------------------------------------------------
ThreadWorkSample::ThreadWorkSample(bool CreateSuspended) : TThread(CreateSuspended)
{
   Number = 0;
}
void __fastcall ThreadWorkSample::Execute()
{
   do { Synchronize(Result); }  while (!Terminated);
}
void __fastcall ThreadWorkSample::NumWrite(short X)
{
   NumRead = X;
}
void __fastcall ThreadWorkSample::Result()
{
   switch (Number)  {
      case 1:
         // ...
         break;
      case 2:
         // ...
         break;
   }
   Sleep(100);
   Application->ProcessMessages();
}
1
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 585
24.02.2013, 15:06  [ТС]
Вот оно недостающее звено:
C++
1
Application->ProcessMessages();
Окончательный вариант получается:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void __fastcall TMyThread::Execute()      
{   
   while (1)
   {
    Sleep(500);
        if (условие, которое точно выполняется)
        {  
                ShowMessage("MyError");
               Application->Terminate();  
               Application->ProcessMessages();
        }
   }
}
Добавлено через 2 минуты
Скажите, пожалуйста, почему рекомендуется использовать Synchronize? В чем существенное преимущество?
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.02.2013, 16:57
Цитата Сообщение от znseday Посмотреть сообщение
Скажите, пожалуйста, почему рекомендуется использовать Synchronize? В чем существенное преимущество?
... читайте книги...
Правильный пример привели, там все вроде правильно за исключением
C++
1
Application->ProcessMessages();
0
18 / 18 / 7
Регистрация: 20.03.2012
Сообщений: 585
24.02.2013, 19:02  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Цитата Сообщение от znseday Посмотреть сообщение
Скажите, пожалуйста, почему рекомендуется использовать Synchronize? В чем существенное преимущество?
Пороть фигню не надо ... читайте книги...
Дайте определение фигни. Попросить объяснить и ответить на конкретный вопрос это фигня?

Цитата Сообщение от Avazart Посмотреть сообщение
Правильный пример привели
Кто привел? Какой именно пример?

Цитата Сообщение от Avazart Посмотреть сообщение
вроде правильно
"вроде" и у меня все правильно. Но я не думаю, что Вы захотите летать на самолете, который "вроде" летает.

Тогда говорите так: "Я не знаю почему это так. Я не знаю, почему это не работает, у меня нет ответа на вопрос. Я умею делать только одним способом. Нам всем нужно читать книги."
0
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
24.02.2013, 19:14
Dam33 Привел код...

Цитата Сообщение от znseday Посмотреть сообщение
Дайте определение фигни.
Ваш код фигня...
Цитата Сообщение от znseday Посмотреть сообщение
Попросить объяснить и ответить на конкретный вопрос это фигня?
В вашем распоряжении просторы интернета - ищите "Потоки","Синхронизация потоков","Объекты синхронизации","Разделяемые ресурсы", читайте книги Архангельского https://www.cyberforum.ru/post3939193.html

Добавлено через 3 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Правильный пример привели, там все вроде правильно за исключением
C++
1
Application->ProcessMessages();
Ибо скорее всего Application разделяемый ресурс.
1
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
25.02.2013, 10:07
Цитата Сообщение от Dam33 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
void __fastcall ThreadWorkSample::Execute()
{
   do { Synchronize(Result); }  while (!Terminated);
}
void __fastcall ThreadWorkSample::NumWrite(short X)
{
   NumRead = X;
}
void __fastcall ThreadWorkSample::Result()
{
   switch (Number)  {
      case 1:
         // ...
         break;
      case 2:
         // ...
         break;
   }
   Sleep(100);
   Application->ProcessMessages();
}
Совершенно бестолковый пример, уж извиняйте.
Поток целиком и полностью выполняется в контексте главного потока - это бессмысленно. Под Synchronize() следует паковать лишь обращение к объектам VCL и прочим разделяемым объектам.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.02.2013, 10:07
Помогаю со студенческими работами здесь

Выйти из метода и вернуть -1, находясь внутри рекурсивной локальной функции
Есть метод, внутри него рекурсивная локальная функция (это условие является важным и изменению не подлежит). Суть в чем, если внутри...

Как правильно выйти из приложения?
package com.example.test; //package com.example; import android.app.Activity; import android.content.Context; import...

Как корректно выйти из приложения
Как правильно обрабатывать сообщения, что-бы выйти из приложения закрыв все потоки? Сделал вот так, и приложение закрывается только со...

Не пытаются ли любые приложения .NET выйти в интернет
Ситуация: есть бд mysql, есть самописное клиентское приложение, сделаное на c# и работающее с этой бд. Сервер и клиенты расположены в одной...

Ожидание внутри потока
Здравствуйте Подскажите, как мне реализовать такой алгоритм Я запускаю поток, в нём двойной цикл for перед j++ происходят действия и...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru