Форум — Ответы ( К темам )
? | Вася: Отдельный поток (24-11-2002 14:26:54) |
Мне посоветывали выполнить часть кода, в отдельном потоке, посмотрел на примеры, почитал help, не получилось, напишите, как это сделать, по нажатию кнопки, чтобы было не сложно, но работало, спасибо! | |
Alexey (25-11-2002 10:18:08) | |
Посмотри пример Threads — там хорошо написаный пример. Если что там неясно — спрашивай конкретно | |
Владимир (25-11-2002 18:26:49) | |
Да, работа с потоками... А лучше без них... Спокойней... Итак, в рамках форума все не расскажешь, да все никто и не знает как оно там живет... Где-то через неделю смотрите статью по работе с потоками в разделе "Начинающим" Кратко — конкретно для 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) | |
Да, статья и пример готовы, смотрите здесь чего непонятно, спрашивайте... |