Вопрос по классу TThread.
Разбирался я тут с классом TThread, посмотрел билдеровский пример и написал простенькую программку: на форме 2 TImage, по нажатию на кнопку Старт запускаются 2 потока и заполняют свои ТImage рандомными линиями (каждый поток заполняет свой TImage - по 5000 линий на каждый). Однако после того как потоки запускаются сама форма перестает на что - либо реагировать (перетаскивание, закрытие и т.д.). Почему ведь потоки выполняются параллельно с основной программой (или это не так)?
Поправочка: ты наверное хотел сказать "Почему ведь потоки выполняются параллельно с основным потоком" ?
Просто два созданных тобой потока, видимо, забивают очередь сообщений, которую обрабатывает основной поток. Как ты рисуешь линии?
Разбирался я тут с классом TThread, посмотрел билдеровский пример и написал простенькую программку: на форме 2 TImage, по нажатию на кнопку Старт запускаются 2 потока и заполняют свои ТImage рандомными линиями (каждый поток заполняет свой TImage - по 5000 линий на каждый). Однако после того как потоки запускаются сама форма перестает на что - либо реагировать (перетаскивание, закрытие и т.д.). Почему ведь потоки выполняются параллельно с основной программой (или это не так)?
Попробуй в своих потоках испольовать Synchronize.
// Important: Methods and properties of objects in VCL can only be
// used in a method called using Synchronize, for example:
//
// Synchronize(UpdateCaption);
//
// where UpdateCaption could look like:
//
// void __fastcall Unit1::UpdateCaption()
// {
// Form1->Caption = "Updated in a thread";
// }
korotche ty prosto zanadto chasto vykorystovyjech resurs, chob vono zapahalo Obnovjaj vikno!
abo chastynu vikna!
abo jakcho bydech vykorystovuvaty jakyjs
element vikna (knopka,list,textove pole)
prosto obnovljaj joho!
Да, насчет основной программы это я оговорился. А линии рисую просто - MoveTo(x,y); LineTo(x1,y1).
Насчет Synchronize - в принципе это помогло, т.е. если в потоке использовать Syncronize(Application->ProcessMessages) то с формой можно работать, но хотелось бы чтобы основной поток и дополнительные работали независимо друг от друга (хотя возможно в данном примере этого и нельзя сделать , т.к. им все равно приходиться использовать общие TImage). Да и вообще при перетаскивании формы начались произвольные исчезновения одного или обоих TImage, т.е. image может исчезнуть вообще, причем даже при повторном нажатии на кнопку Старт (а при этом оба image заливаются белым и рисование повторяется) он/они не появляе(ю)тся.
Очередь сообщений действительно забивается и если вместо рисовательного кода вставить что - нибудь вроде :
while(true)
{
}
то программа нормально работает :-) и окно перетаскивается без ProcessMessages, просто хотелось бы сделать пример программы которая выводила бы что нибудь на независимые TImage и при этом работала сама.
Разбирался я тут с классом TThread, посмотрел билдеровский пример и ...
Если пример из борланда и делаешь типа
while(!Terminated)
{ Synchronize(...); }
попробуй поставить приоритеты потоков ниже чем у основного pThread->Priority = tpLower; например.
Я от конструкции while(!Terminated) отказался, ИМХО на все случаи жизни она не годиться