Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для BARS1991
23 / 15 / 0
Регистрация: 16.11.2009
Сообщений: 332

Многопотоковость и THREAD...

11.11.2011, 18:39. Показов 7840. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет

Кто может объяснить, как работать с THREAD? Вот нашел описание:

TThread в некоторых случаях очень скользкая штука. С ним нельзя обращаться как с обычным классом или компонентом. Некоторые действия с ним уникальны и не имеют аналогов. Посему, надо уяснить все нюансы на ключевых этапах: создание, управление, обмен данными, удаление. Повторю – все уникально и ничего не делай, если не знаешь, как это делается именно в TThread!
1 Создание. File->New->Thread Object. Даем имя THREAD. Сохраняем Unit как THREAD.cpp. Объявлем указатель на объект в файле заголовка Form1 в разделе public: class THREAD *thread ; Подключаем файл “THREAD.h” во все .cpp файлы проета, где нужен thread. Создаем объект:
thread->FreeOnTerminate=true; /* если остаются данные в объекте то можно false;*/
thread->OnTerminate = threadend ; /* функция вызываемая сразу после разрушения объекта
Объявление: void __fastcall threadend (TObject *Sender); необязательно */
thread->Priority = tpIdle; /* рекомендуется; необязательно*/
thread = new THREAD (false) ; /* создаем и сразу запускаем. Если true, то объект Suspended , то есть остановлен */
2 Управление. Вся работа идет внутри единственной функции Execute(). Выход из этой функции означает разрушение объекта (если FreeOnTerminate=true). Поэтому включаем цикл:

C++
1
2
3
4
5
6
7
8
9
10
11
#include “Form1.h”
void __fastcall THREAD::Execute()
{
while ( !Terminated ) /* Terminated- приватный член класса TThread */
{
/* здесь весь код для работы */
SendMessage ( Form1->Handle , ThMessage1 , 0 , 0 ) ;
}
 
exit: /* переход на эту метку означает выход и разрушение объекта*/
};
Объект может быть в двух состояниях: Suspended == true (остановлен) и ==false (работает). Изнутри он может сам себя остановить: Suspend() или Suspended = true ; а вот запустить – никак. Внешнее управление: остановка thread->Suspend(), запуск thread->Resume(). ОСТОРОЖНО!!! - Suspend() увеличивает внутренний счетчик на 1, а Resume() уменьшает на 1. Если дважды вызвать Suspend() и потом один раз Resume(), то объект останется неработающим!!! Поэтому, если надо обязательно запустить:
while ( thread->Suspended ) thread->Resume();

3. Обмен данными. Самое сложное в TThread. Нельзя изменять свойства компонентов напрямую из thread (хотя есть исключения, но лучше не рисковать)!!! И даже обращаясь к переменным и массивам в главной форме надо помнить о побочных эффектах: thread это как бы другая программа, независимая от главной, в смысле очередности обработки данных, событий и вызова функций.
В Helpe есть описание метода Synchronize. Но лично я использовал другой метод: посылка сообщений - он более гибкий:

В файле “Form1.h”
C++
1
2
#define Msend1 WM_USER + 1
#define Msend2 WM_USER + 2
и т.д.

C++
1
2
3
4
5
6
7
8
9
10
11
12
class TForm1: public Tform
{ __published: ……………
public:
 
void __fastcall ThUpdate (TMessage &);
 
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER ( Msend1 , TMessage , ThUpdate )
MESSAGE_HANDLER ( Msend2 , TMessage , ThUpdate )
/*и т.д. все другие сообщения для всех случаев*/
END_MESSAGE_MAP(TComponent)
}
В файле “Form1.cpp”
C++
1
2
3
4
5
6
7
8
9
10
void __fastcall ThUpdate (TMessage &msg)
{ if ( msg.Msg == Msend1 )
{ /* здесь можно обращаться к компонентам */
Label1->Caption = “Get message from Thread”;
}
if ( msg.Msg == Msend2 )
Memo1->Lines->Add( “Получено сообщение из thread”);
 
/* …. и далее остальные сообщения …Можно передавать дополнительные данные в msg.WParam и msg.LParam */
};
В самом thread достаточно написать:
C++
1
SendMessage ( Form1->Handle , Msend1 , 0 , 0 ) ; /*вместо 0 можно доп. параметры*/
4. Удаление. Тоже уникальный процесс. Единственная возможность – завершение функции Execute() !!! Необходимо как то сообщить этой функции, что бы она завершилась. Можно установить методом thread->Terminate() приватный член Terminated в true и периодически, в цикле проверять его значение. Если он таки true, тогда return или переход на метку exit: (см. выше) и выход. Никакими другими способами не удаляй thread !!! Естественно, если объект остановлен (Suspended==true), то сперва его следует запустить, что бы он разнюхал что к чему (см. выше). Сразу после этого вызывается функция threadend() (если только она объявлена в событии thread->OnTerminate) и в ней уже можно написать thread=NULL.

Это примитивный пример, как из объекта написать строчки в Label1 и Memo1.
Выглядит это не очень радостно, но такова плата за многопоточность…
Но на
C++
1
thread->OnTerminate = threadend ;
компилятор ругается... Без этой строчки копилируется, но при попытке выполнить код, относящийся к THREAD, выскакивает ошибка



У меня Code Gear Rad Studio 2007, OS Windows 7.

Что делать?
Миниатюры
Многопотоковость и THREAD...  
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.11.2011, 18:39
Ответы с готовыми решениями:

Многопотоковость.
N-ядерный процессор-для того что бы задействовать все ядра-необходимо формировать соответствующие потоки, или можно "заставить"...

Многопотоковость в VB??
Собственно ... а как? Да есть API функции, но у меня большая проблема с его терминированием. Он ПРОСТО не терминируется и прога...

Непонятки в Java. Chain method call. Thread.start() vs Thread.run()
Ребят, кто знает подскажите, изучаю Java уже 4 месяца, а до меня все не доходит вот к примеру такая запись, ...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.11.2011, 18:39
Помогаю со студенческими работами здесь

Неоднозначный вызов следующих методов или свойств - Thread.Thread()
Вот кусок кода, по которому у меня вопрос: this.dataGridView1.Rows.Insert(this.dataGridView1.Rows.Count, new object); ...

Передать данные в работающий thread из другого thread
Есть 2 потока запущенные разными классами и из потока А нужно сообщить потоку Б что бы он запустил свою определенную функцию. Ссылки на...

Метод Thread.Suspend(),Thread.Resume()
Здравствуйте,пытаюсь сделать игру простенькую в Windows Form. И хочу,чтобы в ней было включено нажатие на паузу и возобновление, для этого...

Как исправить проблему с Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException at...

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException при создании Label
Пытаюсь написать чат по видео, в видео писали на Swing, я решил на JavaFX сразу начать учиться. Написал код, сервер и клиентская часть...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
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 11.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 с альфа-каналом (с прозрачным. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru