Nach Hause
Top.Mail.Ru Yandeks.Metrika
Forum: "Haupt";
Aktuelles Archiv: 2002.01.08;
Herunterladen: [xml.tar.bz2];

Nach unten

Thread: Suspend / Resume & Synchronize Finden Sie ähnliche Zweige


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

Liebe Kolleginnen und Kollegen, bitte helfen Sie, ich habe noch keine 3-Nächte geschlafen.
Das Problem ist:
Wenn Sie den Thread, der Synchronize aufruft, häufig aussetzen (Suspend) und ausführen (Resume), hängt das Programm beim Neuzeichnen des Fensters häufig.
Wenn Sie beispielsweise das folgende Programm ausführen und zwischen Delphi wechseln, bleibt die folgende Anwendung für immer still:

verwendet
Windows, Meldungen, SysUtils, Klassen, Grafiken, Steuerelemente, Formulare,
Dialoge, ExtCtrls, StdCtrls, ComCtrls;

Typ

TMyThread = Klasse (TThread)
privat
Prozedur Update;
geschützt
Prozedur ausführen; überschreiben;
end;

TMainForm = Klasse (TForm)
Timer1: TTimer;
Prozedur FormCreate (Sender: TObject);
procedure FormClose (Sender: TObject; var Aktion: TCloseAction);
Prozedur Timer1Timer (Sender: TObject);
privat
{Private Deklarationen}
MyThread: TMyThread;
Öffentlichkeit
{Öffentliche Erklärungen}
end;

jung
MainForm: TMainForm;

Implementierung

{$ R * .dfm}

Prozedur TMyThread.Update;
beginnen
//
end;

Prozedur TMyThread.Execute;
beginnen
wiederholen
Schlaf (100);
Synchronisieren (Update);
bis zum Abbruch;
end;

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

procedure TMainForm.FormClose (Sender: TObject; var Aktion: TCloseAction);
beginnen
Timer1.Enabled: = false;
wenn MyThread.Suspended dann MyThread.Resume;
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
end;

Prozedur TMainForm.Timer1Timer (Sender: TObject);
beginnen
Wenn nicht MyThread. Suspended, dann MyThread. Suspend else My Thread. Resume;
end;

All dies ist dafür nötig: Ich habe eine animierte Schaltfläche erstellt: Sie zeigen mit der Maus darauf - der Stream wird abgespielt, die Animation wird abgespielt, Sie entfernen die Maus - der Fluss stoppt. Der Benutzer kann die Maus oft tragen, so dass dies zu dem oben genannten Problem führt.
In meinem Programm kann kein Timer anstelle von Streams verwendet werden.
Wenn Ihnen jemand sagt, was los ist, gebe ich ihm meine besten Komponenten (einschließlich einer animierten Schaltfläche). Ich schwöre feierlich.
Ich entschuldige mich für die lange Frage, aber kurz gesagt, es ist unmöglich.
Delphi6, Win98.
Vielen Dank.



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

Suspend / Resume ist in diesem Fall nicht die beste Lösung. Und die Verwendung des Flusses für jede Taste ist ebenfalls schlecht. Sobald Sie jedoch einen Stream benötigen, machen Sie es nicht einfacher: Wenn die Animation gestartet werden muss, setzen wir das Flag, die Ausführungsmethode überprüft dieses Flag, und wenn es gesetzt ist, zeichnet es die Animation. Wenn der Cursor weg ist, setzen wir dieses Flag zurück.
Das einzige Problem bestand darin, dass das Flag durch Aufruf einer der Funktionen Interlocked * geändert wurde. beispielsweise InterlockedIncrement / InterlockedDecrement.

"Ich entschuldige mich für die lange Frage, aber auf keinen Fall kann es so sein."
Alle Fragen wären so lang und ausführlich :)



Seiten: 1 ganze Branche

Forum: "Haupt";
Aktuelles Archiv: 2002.01.08;
Herunterladen: [xml.tar.bz2];

nach oben





Speicher: 0.55 MB
Zeit: 0.023 c
4-22482
PONTIY
2001-11-01 10:06
2002.01.08
WinExec oder ShellExecute


1-22197
T2
2001-12-16 07:17
2002.01.08
Kann der Windows-Korb programmgesteuert deaktiviert werden?


1-22018
Delphig
2001-12-18 01:51
2002.01.08
Text aus Memo drucken! Ich habe etwas falsches ....


4-22502
Alexander
2001-11-06 11:00
2002.01.08
So erhalten Sie ein Symbol für eine registrierte Erweiterung im System


1-21999
Elefant
2001-12-15 02:02
2002.01.08
C ++ oder Delphi





Afrikanisch Albanien Arabisch Armenisch Aserbaidschanisch Baskisch Weißrusse Bulgarisch katalanisch Chinesisch (vereinfacht) Chinesisch (traditionell) kroatisch Tschechisch Dänisch Niederländisch Englisch estnisch Philippinisch Finnisch Französisch
Galicisch Georgisch Deutsch Griechisch haitian Creole Hebräisch Hindi ungarisch isländisch Indonesian irisch Italienisch Japanisch Koreanisch lettisch litauisch Makedonisch Malay Maltesisch Norwegisch
persisch Polnisch Portugiesisch Rumänisch Russisch serbisch Slovakisch Slowenisch Spanisch Suaheli Schwedisch Thai Türkisch Ukrainisch Urdu Vietnamesisch Walisisch Jiddisch Bengalisch Bosnisch
cebuano Esperanto Gujarati Hausa Hmong igbo Javanisch kannada Khmer Laotisch Lateinisch Maorisch Marathi Mongolisch nepali Pandschabi Somalisch Tamilisch Telugu Yoruba
Zulu
Английский Französisch Deutsch Italienisch Португальский Russisch Spanisch