Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249

Отображения на форме текстового сообщения с информацией о ходе расчета в отдельном потоке

15.08.2014, 20:50. Показов 3764. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делаю программу, которая занимается вычислениями. Вычислений много и если их не вынести в отдельный поток, то программа выглядит подвисшей, пока вычисления не закончатся. Ниже код в сокращенном виде.
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
class TMyThread: public TThread
{
    protected:
        void __fastcall Execute();
 
    private:
        void __fastcall NewCaption();
        UnicodeString CurrentAction;
};
 
void __fastcall TMyThread::Execute()
{
    int it = -1;
    do
    {
        it++;
        CurrentAction = "Итерация " + IntToStr(it+1) + "...";
        Synchronize(NewCaption);
    }
    while (it < 100000);
}
 
void __fastcall TMyThread::NewCaption()
{
    Form1->Label1->Caption = CurrentAction;
}
В таком варианте на главной форме не отображаются промежуточный отметки. Только по окончании цикла появляется последняя запись. Если функцию NewCaption() модифицировать так:

C++
1
2
3
4
5
void __fastcall TMyThread::NewCaption()
{
    Form1->Label1->Caption = CurrentAction;
    Application->ProcessMessages();
}
то все отображается как надо, но у меня сомнения в уместности использования здесь ProcessMessages(). Можно решить вопрос без этой функции?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.08.2014, 20:50
Ответы с готовыми решениями:

TIdHTTP в отдельном потоке и прогресс бар на основной форме
У меня есть TIdHTTP (upd) в отдельном потоке и надо отобразить хот загрузки файла на основной форме. Все бы хорошо, но значение...

Вывод сообщения в отдельном окне с информацией
Знающие люди подскажите пожалуйста. Нужен батник для вывода сообщения с информацией в отдельном окне как на первом скриншоте ...

Создать приложение, в отдельном потоке вычисляющее значение w и непрерывно обновляющее его в потоке
Ребят, с потоками не работал не когда. Есть задание , я понимаю что хотят, а вот как сделать потоками хз . Создайте приложение, в...

32
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2014, 12:34
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от UI Посмотреть сообщение
// публичное поле bool FSuspended в классе потока
Ну так не вводите в заблуждение дурацкими названиями.
Цитата Сообщение от UI Посмотреть сообщение
В чем проблема-то? Лишь бы что-то сказать? Если у тебя в блоге чего-то нет - это неправильно?
Не ведусь на провокации.

SatanaXIII Ну, если схематично так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TSaveFileThread::Execute()
{
  while(!Terminated)
   {
     WaitForSingleObject(hThreadDoneEvent,INFINITE); //  ждем события
     if(Terminated) break; 
     DoCalculate();
     ResetEvent( hThreadDoneEvent );
   }
}
 
 
void __fastcall TSaveFileThread::DoNext() // Метод для перехода к следующим вычислениям.
{
   SetEvent( hThreadDoneEvent );
}
2
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
19.08.2014, 16:01
Цитата Сообщение от Avazart Посмотреть сообщение
Ну, если схематично так
Я уж понял, спасибо.

Добавлено через 3 часа 10 минут
Вариант с пульсирующим событием хорош тем, что из потока постоянно торчит синхронизированный флаг состояния его завершения. Но при этом идет привязка к виндовой платформе. В варианте UI нет привязки, но как она на счет синхронизации?
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2014, 16:05
Цитата Сообщение от SatanaXIII Посмотреть сообщение
при этом идет привязка к виндовой платформе.
А вы пишите под другие?
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
19.08.2014, 16:07
Цитата Сообщение от Avazart Посмотреть сообщение
А вы пишите под другие?
Нет. Я просто интересуюсь.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2014, 16:09
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Нет. Я просто интересуюсь.
Ну так я писал
Цитата Сообщение от Avazart Посмотреть сообщение
для это есть объекты события типа TSimpleEvent
Как бы обвертка VCL-ная т.е поидее должна реализоваться для каждой платформы.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
19.08.2014, 16:09
К примеру, легко метод UI переписать под Lazarus, а он уже кроссплатформенный впринципе.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2014, 16:11
Цитата Сообщение от SatanaXIII Посмотреть сообщение
В варианте UI нет привязки, но как она на счет синхронизации?
Мне не нравится, атомарность bool сомнительна, в переменную пишется и читается из разных потоков.
Про жор ресурсов молчу.

Цитата Сообщение от SatanaXIII Посмотреть сообщение
К примеру, легко метод UI переписать под Lazarus, а он уже кроссплатформенный впринципе.
Переписать код С++ на паскаль ?
Не правильнее ли смотреть в сторону FMX, ну или вообще забить на билдер.
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
19.08.2014, 16:19
Цитата Сообщение от Avazart Посмотреть сообщение
Как бы обвертка VCL-ная т.е поидее должна реализоваться для каждой платформы.
Ну понял.
Цитата Сообщение от Avazart Посмотреть сообщение
атомарность bool сомнительна
Да, я помню ваш этот аргумент. Не могу на его счет пока аргументированно высказаться.
Цитата Сообщение от Avazart Посмотреть сообщение
Переписать код С++ на паскаль ?
Да и ничего в этом страшного нет.
Цитата Сообщение от Avazart Посмотреть сообщение
Не правильнее ли смотреть в сторону FMX
Не думаю, что смотреть в сторону мотофристайла это вообще полезно для программирования.
Цитата Сообщение от Avazart Посмотреть сообщение
ну или вообще забить на билдер
Ну как бы про билдер разговариваем. Но все понятно.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2014, 16:30
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Да и ничего в этом страшного нет.
А смысл писать для виндовс на С++, а для других платформ на Pascal? при чем в разных средах разработки?
Не лучше ли сразу писать все на паскале и все в Lazarius?
Ну или сразу все в С++Builder используя FMX, если нам нужно только Win/Mac a не Win/Lin/Mac/...
Т.е если нам нужна поддержка Linux то тут трабла ибо ее пока в FMX не предвидится, и тут возникает вопрос не перейти ли например с C++Builder на C++Qt
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
19.08.2014, 16:36
Цитата Сообщение от Avazart Посмотреть сообщение
Не лучше ли сразу писать все на паскале и все в Lazarius?
Я это вот и имел в виду. Что, если человек хочет подобным образом засинхронизировать потоки, и он при этом пишет в Lazarus-e, то ему проще было бы воспользоваться UI-ным вариантом, где не содержится каких-то мощных сторонних штук (WinApi-шных в частности). Если б второй вариант был бы переписан с помощью TSimpleEvent, тогда бы разницы не было.
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.08.2014, 16:50
Цитата Сообщение от SatanaXIII Посмотреть сообщение
если человек хочет
Цитата Сообщение от SatanaXIII Посмотреть сообщение
и он при этом пишет в Lazarus-e
А, если человек хочет миллион баксов, и при этом пишет правой ногой ?
Выиграет ли он в лотерею ?

Добавлено через 2 минуты
Цитата Сообщение от SatanaXIII Посмотреть сообщение
то ему проще было бы воспользоваться UI-ным вариантом
И что? Плевать на абсолютно не нужную нагрузку проца ?

Добавлено через 2 минуты
Цитата Сообщение от SatanaXIII Посмотреть сообщение
где не содержится каких-то мощных сторонних штук (WinApi-шных в частности).
Ну как бы на других платформах думаю есть аналоги им.
Кроме того как бы примитивное апи называть мощной и сторонней штукой, как-то ...
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
20.08.2014, 13:09
Как на счет такого варианта (без всяких проверок. костяк)?
Код
Поток:
C++
1
2
3
4
5
6
7
8
9
10
11
12
class SaveThread : public TThread
{
private:
        void __fastcall Body();
        HANDLE hThreadDoneEvent;
protected:
        void __fastcall Execute();
public:
        __fastcall SaveThread( bool CreateSuspended, HANDLE hThreadDoneEvent = NULL );
 
        void __fastcall Reloop();
};
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
__fastcall SaveThread::SaveThread( bool CreateSuspended, HANDLE hThreadDoneEvent_ )
        : TThread(CreateSuspended),
          hThreadDoneEvent( hThreadDoneEvent_ )
{
this->FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall SaveThread::Execute()
{
  while( !this->Terminated )
    {
    WaitForSingleObject( hThreadDoneEvent, INFINITE );
 
    Body();
 
    ResetEvent( hThreadDoneEvent );
    }
}
//---------------------------------------------------------------------------
void __fastcall SaveThread::Body()
{
//
}
//---------------------------------------------------------------------------
void __fastcall SaveThread::Reloop()
{
if( this->Suspended )
  this->Resume();
 
SetEvent( hThreadDoneEvent );
}
И собственно использование:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void __fastcall TForm1::BCreateClick(TObject *Sender)
{
hThreadDoneEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
sThread = new SaveThread( false, this->hThreadDoneEvent );
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BRunOnceClick(TObject *Sender)
{
sThread->Reloop();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BKillClick(TObject *Sender)
{
sThread->Terminate();
 
CloseHandle( hThreadDoneEvent );
}
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.08.2014, 13:15
Найди 100 и 1 различие в коде, и скажи почему твой пример хуже.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.08.2014, 13:15

GDI+. Почему в отдельном потоке картинки сохраняются как белые прямоугольники, а в основном потоке - всё Ок?
Всем привет, делаю функцию уменьшения картинок при помощи библиотеки GDI+, в отдельном потоке происходит уменьшение картинки и её...

Класс в отдельном потоке
Привет. Мне нужно, чтобы класс выполнялся в отдельном потоке. #include &lt;iostream&gt; #include &lt;thread&gt; #include...

QGraphicsScene в отдельном потоке
Доброе утро. Подскажите пожалуйста.Всего три потока: Гуи, Идет прием UDP, обработка . Принимаются множество &quot;пакетов&quot; и из...

Форма в отдельном потоке
Привет, есть 3 формы (грубо говоря две) одну надо запустить в отдельный поток. Form1 С нее происходит запуск формы по нажатию кнопки. ...

Запросы к БД в отдельном потоке
Всем привет! Хочу спросить специалистов и просто опытных людей. Делаю приложение winForms. Приложение будет отображать результаты...


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
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