Главная страница
    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, то нижеприведенное приложение умолкнет навеки:

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, ComCtrls;

type

TMyThread = class(TThread)
private
procedure Update;
protected
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
{ Private declarations }
MyThread: TMyThread;
public
{ Public declarations }
end;

var
MainForm: TMainForm;

implementation

{$R *.dfm}

procedure TMyThread.Update;
begin
//
end;

procedure TMyThread.Execute;
begin
repeat
Sleep(100);
Synchronize(Update);
until Terminated;
end;

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

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

procedure TMainForm.Timer1Timer(Sender: TObject);
begin
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.45 MB
Время: 0.007 c
14-22401
wHammer
2001-11-09 12:56
2002.01.08
Вот интересно стало?


3-21963
szap
2001-12-05 11:53
2002.01.08
Скорость


6-22279
Денис
2001-07-28 22:08
2002.01.08
NMSMTP через прокси


1-22243
Gumbert-Gumbert
2001-12-16 22:22
2002.01.08
Как в Дельфи взять корень n-ой степени?


14-22363
Дремучий
2001-11-02 18:16
2002.01.08
Ну и ...?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский