Casa
Top.Mail.Ru Yandeks.Metrika
Foro: "Principal";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

abajo

Thread: Suspend/Resume & Synchronize Encontrar ramas similares


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

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

usos
Windows, Mensajes, Sistemas, Clases, Gráficos, Controles, Formularios,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;

tipo

TMyThread = class(TThread)
privada
procedure Update;
protegido
Procedimiento de ejecución; anular
fin;

TMainForm = class(TForm)
Timer1: TTimer;
procedimiento FormCreate (Sender: TObject);
procedimiento FormClose (Sender: TObject; var Action: TCloseAction);
procedimiento Timer1Timer (Sender: TObject);
privada
{Declaraciones privadas}
MyThread: TMyThread;
público
{Declaraciones públicas}
fin;

var
MainForm: TMainForm;

implementación

{$ R * .dfm}

procedure TMyThread.Update;
comenzar
//
fin;

procedure TMyThread.Execute;
comenzar
repetir
Sleep (100);
Synchronize(Update);
until Terminated;
fin;

procedure TMainForm.FormCreate(Sender: TObject);
comenzar
MyThread := TMyThread.Create(false);
Timer1.Interval := 1;
Timer1.Enabled := true;
fin;

procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
comenzar
Timer1.Enabled := false;
if MyThread.Suspended then MyThread.Resume;
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
fin;

procedure TMainForm.Timer1Timer(Sender: TObject);
comenzar
if not MyThread.Suspended then MyThread.Suspend else MyThread.Resume;
fin;

Нужно это все вот для чего: я сделал анимированную кнопку: наводишь на нее мышкой - запускается поток, проигрывающий анимацию, убираешь мышку - поток останавливается. Пользователь может возить мышкой довольно часто, поэтому это и приводит к вышеописанной проблеме.
В моей программе нельзя использовать Timer вместо потоков.
Если кто-нибудь подскажет в чем тут дело, я подарю ему свои лучшие компоненты(включая анимированную кнопку). Торжественно клянусь.
Прошу прощения за длинный вопрос, но короче никак нельзя.
Delphi6, Win98.
Gracias.



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

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

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



Páginas: 1 rama entera

Foro: "Principal";
Archivo actual: 2002.01.08;
Descargar: [xml.tar.bz2];

arriba















Memoria: 0.82 MB
Tiempo: 0.026 c
14-22339
Chino como Zo Vut
2001-11-01 10:12
2002.01.08
Programador, ¿cómo te llamas?


4-22490
SergeyDonetsk
2001-11-06 09:22
2002.01.08
Al igual que en la API, puede saber Manejar lienzo y configurar


3-21985
Scully
2001-12-06 15:26
2002.01.08
Fecha + hora sin segundos en DBGrid


6-22277
prosof
2001-10-02 10:21
2002.01.08
Определение траффика каждого корреспондента сети по IP.


1-22221
Agrio
2001-12-16 21:00
2002.01.08
Recursos





africaans albanés Arabic armenio Azerbaiyán vasco Bielorruso Bulgarian Catalán Chino (simplificado) Chino (tradicional) Croata Checo Danés Dutch Inglés Estonia filipina Finnish Francés
gallego georgiano Alemán Griego criollo haitiano hebreo hindi Húngaro islandés Indonesian irlandés Italiano Japonés Korean letón lituano macedonio Malay maltés Noruego
persa polaco Portuguese rumano Ruso Serbio Slovak Esloveno Español swahili Sueco Thai turco ucranio Urdu vietnamita galés yídish bengalí bosnio
cebuano esperanto gujarati hausa hmong igbo javanés kannada khmer lao latín maorí marathi mongol nepali punjabi somalí Tamil telugu yoruba
zulú
Английский Francés Alemán Italiano portugués Русский Español