Головна сторінка
Top.Mail.Ru Яндекс.Метрика
Форум: "Основна";
Поточний архів: 2002.01.08;
Завантажити: [xml.tar.bz2];

Вниз

Thread: Suspend / Resume & Synchronize Знайти схожі гілки


mitry   (2001-12-15 02:53) [0]

Шановні колеги, допоможіть будь ласка, я не спав уже 3 ночі.
Проблема ось у чому:
Якщо часто призупиняти (Suspend) і запускати (Resume) потік, який визиают Synchronize, то при перемальовуванні вікна, програма часто висне.
Наприклад, якщо запустити наступну програму і попереключать між нею і Delphi, то нижчевикладене додаток замовкне навіки:

використовує
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;

тип

TMyThread = class (TThread)
приватний
procedure Update;
захищений
procedure Execute; override;
end;

TMainForm = class (TForm)
Timer1: TTimer;
procedure FormCreate (Sender: TObject);
procedure FormClose (Sender: TObject; var Action: TCloseAction);
procedure Timer1Timer (Sender: TObject);
приватний
{Private declarations}
MyThread: TMyThread;
громадськість
{Public declarations}
end;

було
MainForm: TMainForm;

реалізація

{$ R * .dfm}

procedure TMyThread.Update;
починати
//
end;

procedure TMyThread.Execute;
починати
повторювати
Sleep (100);
Synchronize (Update);
until Terminated;
end;

procedure TMainForm.FormCreate (Sender: TObject);
починати
MyThread: = TMyThread.Create (false);
Timer1.Interval: = 1;
Timer1.Enabled: = true;
end;

procedure TMainForm.FormClose (Sender: TObject; var Action: TCloseAction);
починати
Timer1.Enabled: = false;
if MyThread.Suspended then MyThread.Resume;
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
end;

procedure TMainForm.Timer1Timer (Sender: TObject);
починати
if not MyThread.Suspended then MyThread.Suspend else MyThread.Resume;
end;

Потрібно це все ось для чого: я зробив анімовану кнопку: наводиш на неї мишкою - запускається потік, що програє анімацію, прибираєш мишку - потік зупиняється. Користувач може возити мишкою досить часто, тому це і призводить до вищеописаної проблеми.
У моїй програмі можна використовувати Timer замість потоків.
Якщо хто-небудь підкаже в чому тут справа, я подарую йому свої кращі компоненти (включаючи анімовану кнопку). Урочисто присягаю.
Прошу вибачення за довгий питання, але коротше ніяк не можна.
Delphi6, Win98.
Спасибо.



paul_shmakov   (2001-12-16 02:06) [1]

використання suspend / resume в даному випадку не кращий вихід. та й використання потоку для кожної кнопки - теж погано. але раз потрібен потік, тоді чому б не зробити простіше: коли виникає необхідність почати відтворювати анімацію ми встановлюємо прапор, метод execute перевіряє цей прапор, і, якщо він встановлений, виконує промальовування анімації. коли курсор з кнопки пішов - скидаємо цей прапор.
єдине, щоб не було проблем, прапор потрібно міняти викликом однієї з Interlocked * функцій. наприклад, InterlockedIncrement / InterlockedDecrement.

"Прошу вибачення за довгий питання, але коротше ніяк не можна."
все б питання були такими довгими і докладними :)



сторінки: 1 вся гілка

Форум: "Основна";
Поточний архів: 2002.01.08;
Завантажити: [xml.tar.bz2];

наверх









Пам'ять: 0.56 MB
Час: 0.023 c
1-22063
мистецтво
2001-12-18 15:12
2002.01.08
А можна заблокувати доступ до папки, щось типу fmShareExclusive, але для папки ???


1-22222
Eugene Zelikovsky
2001-12-14 13:58
2002.01.08
CallBack


6-22310
SERGX
2001-10-13 23:48
2002.01.08
ХЕЛП !! Як створити прогу для відсилання файлу або тексту поштою


1-22236
T2
2001-12-16 07:10
2002.01.08
serial.vxd


7-22441
ульісс
2001-09-19 20:31
2002.01.08
Delphi 5 Ent не ставиться нормально під Win2k Pro





африкаанс албанський арабська вірменин азербайджанець баскський білоруський болгарська каталонський Китайська (спрощене письмо) Китайський традиційний) хорватський чеська данську мову нідерландський Ukranian естонець Філіппінська фінську мову французький
галісійська грузинський німецький грецький гаїтянський креольський давньоєврейську хінді угорський ісландський індонезієць ірландський італійський японський корейський латиська литовець македонець малайський мальтійський норвежець
перс полірування португальська румунський російська сербський словацький словенський іспанська суахілі шведську мову тайський турецька український урду в'єтнамський валлійський ідиш бенгальський боснійський
кебуано есперанто гуджараті хауса хмонг ігбо яванський каннада кхмерская Лао латинь маорі маратхі монгольський непальська панджабі сомалійський тамільська телугу йоруба
зулуський
Англійська Французький Німецький Італійський Португальська Русский Іспанська