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

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

15.08.2014, 20:50. Показов 3448. Ответов 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
8484 / 6151 / 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
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Первый деплой
lagorue 17.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru