Տուն
Top.Mail.Ru Moscow
Ֆորում: «Գլխավոր»;
Ընթացիկ արխիվը `2002.01.08;
Բեռնել: [xml.tar.bz2];

Down

Թեմա `կասեցնել / ռեզյումեն եւ համաժամացնել Գտնել նմանատիպ մասնաճյուղեր


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

Уважаемые коллеги, помогите пожалуйста, я не спал уже 3 ночи.
Խնդիրն այն է.
Если часто приостанавливать(Suspend) и запускать(Resume) поток, который вызыает Synchronize, то при перерисовке окна, программа часто виснет.
Например, если запустить следующую программу и попереключаться между ней и Delphi, то нижеприведенное приложение умолкнет навеки:

uses
Windows, Messages, SysUtils, դասընթացներ, գրաֆիկա, վերահսկում, ձեւեր,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;

տիպ

TMyThread = դաս (TThread)
անձնական
procedure Update;
պաշտպանված
ընթացակարգը կատարում; անտեսում;
վերջը.

TMainForm = դաս (TForm)
Timer1- ը `TTimer;
ընթացակարգ FormCreate (Ուղարկող `TObject);
ընթացակարգ FormClose (Sender: TObject, var Action: TCloseAction);
ընթացակարգ Timer1Timer (Ուղարկող `TObject);
անձնական
{Անձնական հայտարարություններ}
MyThread: TMyThread;
հասարակություն
{Հանրային հայտարարություններ}
վերջը.

էր
Գլխավոր ձեւ: TMainForm;

իրականացում

{$ R * .dfm}

procedure TMyThread.Update;
սկսել
//
վերջը.

ընթացակարգ TMyThread.Execute;
սկսել
կրկնել
Քնել (100);
Synchronize(Update);
մինչեւ դադարեցված;
վերջը.

ընթացակարգ TMainForm.FormCreate (Ուղարկող `TObject);
սկսել
MyThread := TMyThread.Create(false);
Timer1.Interval: = 1;
Timer1.Enabled: = true;
վերջը.

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
սկսել
Timer1.Enabled: = false;
if MyThread.Suspended then MyThread.Resume;
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
վերջը.

procedure TMainForm.Timer1Timer(Sender: TObject);
սկսել
if not MyThread.Suspended then MyThread.Suspend else MyThread.Resume;
վերջը.

Нужно это все вот для чего: я сделал анимированную кнопку: наводишь на нее мышкой - запускается поток, проигрывающий анимацию, убираешь мышку - поток останавливается. Пользователь может возить мышкой довольно часто, поэтому это и приводит к вышеописанной проблеме.
В моей программе нельзя использовать Timer вместо потоков.
Если кто-нибудь подскажет в чем тут дело, я подарю ему свои лучшие компоненты(включая анимированную кнопку). Торжественно клянусь.
Прошу прощения за длинный вопрос, но короче никак нельзя.
Delphi6, Win98.
Շնորհակալություն:



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

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

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



Էջեր: 1 ամբողջ ճյուղը

Ֆորում: «Գլխավոր»;
Ընթացիկ արխիվը `2002.01.08;
Բեռնել: [xml.tar.bz2];

Up









Հիշողություն `0.56 ՄԲ
Ժամանակը `0.034 գ
1-22257
Dmitry1- ը
2001-12-14 16:53
2002.01.08
Բարի օր


3-21963
szap
2001-12-05 11:53
2002.01.08
Բարեմաղթել


7-22445
Kirill
2001-09-21 19:03
2002.01.08
Գրանցվել dll- ի համար


1-22258
մաշիստական
2001-12-16 23:16
2002.01.08
Երրորդ աստիճանի հավասարումը:


1-22256
քայլելու հարցաշար
2001-12-15 08:50
2002.01.08
Կարդում են արժեքները ini ֆայլից





afrikaans ալբանական արաբական հայերեն ադրբեջանական Բասկերի Բելառուսի Բուլղարիայի catalan Չինարեն (պարզեցված) Չինարեն (ավանդական) Խորվաթիայի չեխ դանիերեն հոլանդական Անգլերեն
Էստոնիայի filipino ֆիններեն ֆրանսերեն
galician վրացական գերմանական հունարեն haitian Creole եբրայերեն հինդի հունգարերեն icelandic հայերեն իռլանդական իտալական ճապոնացի Կորեայի Լատվիայի Լիտվայի մակեդոներեն Մալայերեն մալթերեն նորվեգական
պարսկական Լեհաստանի պորտուգալացի ռումինական ռուսական սերբերեն Սլովակիայի Սլովենիայի իսպաներեն սուահիլի շվեդերեն թայերեն թուրքական ուկրաինական ուրդու վիետնամերեն ուելսերեն հայերեն bengali բոսնիերեն
Cebuano Esperanto գուջարաթի հաուսա Hmong Igbo ճավաերեն kannada Khmer Lao լատիներեն մաորի մարաթի մոնղոլական նեպալերեն Punjabi Somali tamil telugu յորուբա
զուլուսերեն
Անգլերեն Французский Немецкий Итальянский Португальский Русский Испанский