Форум - Ответы     (  К темам )
 ?  Вася: Отдельный поток (24-11-2002 14:26:54)
Мне посоветывали выполнить часть кода, в отдельном потоке, посмотрел на примеры, почитал help, не получилось, напишите, как это сделать, по нажатию кнопки, чтобы было не сложно, но работало, спасибо!
 Alexey (25-11-2002 10:18:08)
Посмотри пример Threads - там хорошо написаный пример.
Если что там неясно - спрашивай конкретно
 Владимир (25-11-2002 18:26:49) http://cbuilder.ru
Да, работа с потоками... А лучше без них... Спокойней...
Итак, в рамках форума все не расскажешь, да все никто и не знает
как оно там живет...

Где-то через неделю смотрите статью по работе с потоками в разделе "Начинающим"


Кратко - конкретно для C++Builder:
TThread - абстрактный класс, который допускает созданию отдельных потоков выполняющихся в приложении, поэтому -
вы должны создать новый объект класса, производного от TThread
Для создания и использования нового объекта потока:

Выберите File | New | Other | Thread Object , чтобы создать новый модуль, содержащий объект, производный от класса TThread,
вам предложат как-то обозвать этот класс, обзовите как вам нравится,
например TMyThread
определите новый конструктор потокового объекта.
определите метод объекта Execute, вставляя код, который должен выполниться,когда поток выполняется.

В основной программе создайте объект этого потокового класса

// создаем поток в приостановленном состоянии (true), запущенном(false)
TMyThread *Thr = new TMyThread(true);

запустите этот поток Thr->Resume();
остановите этот поток Thr->Suspend();
завершить извне поток Thr->Terminate();
и т.д.
После чего засовываете свои сложные вычисления в Execute() (т.е. в отдельный поток)

Далее, если вы хотите из потока обращаться к объектам VCL:

Когда Вы используете объекты из иерархий VCL или CLX, их свойства и методы, не гарантируется безопасность потока. То есть обращаясь к свойствам или выполняя методы этих объектов, могут выполнятся некоторые действия, которые используют память, которая не защищена от действий других потоков.

Для этого необходимо использовать метод Synchronize

void __fastcall TMyThread::Execute()
{
for(int i=0; i<10000; i++)
{
// -- какие-то сложные вычисления в цикле
// ---
Synchronize(pb);
}
}
//---------------------------------------------------------------------------

void __fastcall TMyThread::pb()
{
static int n = 0;
n++;
Form1->Label1->Caption = n;
}
//---------------------------------------------------------------------------

Смотрите короткий пример 5 Kb здесь, через неделю - в разделе "Начинающим" статью о работе с потоками.
 Владимир (26-11-2002 21:18:04) http://cbuilder.ru
Да, статья и пример готовы,
смотрите здесь

чего непонятно, спрашивайте...


support@cbuilder.ru