10 / 10 / 4
Регистрация: 12.10.2013
Сообщений: 249

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

15.08.2014, 20:50. Показов 3613. Ответов 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
[golang] Двоичная куча, min-heap
alhaos 20.05.2026
Двоичная куча Двоичная куча — структура данных, которая всегда держит самый важный элемент наготове. Представьте очередь к хилеру в игре, и очередь из игроков в приоритете те у кого меньше. . .
[golang] Breadth-First Search
alhaos 19.05.2026
BFS (Breadth-First Search) — это базовый алгоритм обхода графа в ширину, который поуровнево исследует все связанные вершины. Он начинает с выбранной точки и проверяет всех соседей, прежде чем. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru