Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Вопрос по классу TThread.

1.1K
29 августа 2003 года
teran
73 / / 15.04.2003
Разбирался я тут с классом TThread, посмотрел билдеровский пример и написал простенькую программку: на форме 2 TImage, по нажатию на кнопку Старт запускаются 2 потока и заполняют свои ТImage рандомными линиями (каждый поток заполняет свой TImage - по 5000 линий на каждый). Однако после того как потоки запускаются сама форма перестает на что - либо реагировать (перетаскивание, закрытие и т.д.). Почему ведь потоки выполняются параллельно с основной программой (или это не так)?
3
29 августа 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by teran
Разбирался я тут с классом TThread, посмотрел билдеровский пример и написал простенькую программку: на форме 2 TImage, по нажатию на кнопку Старт запускаются 2 потока и заполняют свои ТImage рандомными линиями (каждый поток заполняет свой TImage - по 5000 линий на каждый). Однако после того как потоки запускаются сама форма перестает на что - либо реагировать (перетаскивание, закрытие и т.д.). Почему ведь потоки выполняются параллельно с основной программой (или это не так)?



Поправочка: ты наверное хотел сказать "Почему ведь потоки выполняются параллельно с основным потоком" ?

Просто два созданных тобой потока, видимо, забивают очередь сообщений, которую обрабатывает основной поток. Как ты рисуешь линии?

427
29 августа 2003 года
Glazunov Oleg
79 / / 20.03.2000
Цитата:
Originally posted by teran
Разбирался я тут с классом 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";
// }

2.4K
30 августа 2003 года
ivi
11 / / 04.06.2003
Ta sama kartyna bula v mene z GTK+ pi Linux

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!
1.1K
31 августа 2003 года
teran
73 / / 15.04.2003
Отвечаю по порядку.
Да, насчет основной программы это я оговорился. А линии рисую просто - MoveTo(x,y); LineTo(x1,y1).
Насчет Synchronize - в принципе это помогло, т.е. если в потоке использовать Syncronize(Application->ProcessMessages) то с формой можно работать, но хотелось бы чтобы основной поток и дополнительные работали независимо друг от друга (хотя возможно в данном примере этого и нельзя сделать , т.к. им все равно приходиться использовать общие TImage). Да и вообще при перетаскивании формы начались произвольные исчезновения одного или обоих TImage, т.е. image может исчезнуть вообще, причем даже при повторном нажатии на кнопку Старт (а при этом оба image заливаются белым и рисование повторяется) он/они не появляе(ю)тся.
Очередь сообщений действительно забивается и если вместо рисовательного кода вставить что - нибудь вроде :

while(true)
{
}

то программа нормально работает :-) и окно перетаскивается без ProcessMessages, просто хотелось бы сделать пример программы которая выводила бы что нибудь на независимые TImage и при этом работала сама.
989
01 сентября 2003 года
Vlad232ua
182 / / 02.04.2003
Цитата:
Originally posted by teran
Разбирался я тут с классом TThread, посмотрел билдеровский пример и ...


Если пример из борланда и делаешь типа
while(!Terminated)
{ Synchronize(...); }
попробуй поставить приоритеты потоков ниже чем у основного pThread->Priority = tpLower; например.
Я от конструкции while(!Terminated) отказался, ИМХО на все случаи жизни она не годиться

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог