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;

war
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.82 MB
Zeit: 0.029 c
6-22288
atmosphärisch
2001-10-09 23:49
2002.01.08
WinGate


4-22458
Ajax
2001-10-31 17:50
2002.01.08
TColor und RGB


3-21912
Sergey N.
2001-12-04 06:23
2002.01.08
Behandeln von Daten von IB nach Delphi und zurück


1-22008
Alligator
2001-12-17 11:46
2002.01.08
HILFE !!!


14-22342
Dicht
2001-11-05 18:52
2002.01.08
Wettbewerb! Wallpaper für das Spiel Sea Fight!





Afrikanisch Albanien Arabisch Armenisch Aserbaidschanisch Baskisch Weißrusse Bulgarian katalanisch Chinesisch (vereinfacht) Chinesische Tradition) kroatisch Tschechisch Dänisch Dutch Englisch estnisch Philippinisch Finnish Französisch
Galicisch Georgisch Deutsch Griechisch haitian Creole Hebräisch Hindi ungarisch isländisch Indonesian irisch Italian Japanisch Koreanisch lettisch litauisch Makedonisch Malay Maltesisch Norwegian
persisch Polnisch Portugiesisch Rumänisch Russisch serbisch Slovakisch Slowenisch Spanisch Suaheli Swedish 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