Hallo sirius,
vielen Dank, dass Du dir die Mühe gemacht hast mir so ausführlich zu antworten. Muss mir das nachher erstmal in aller Ruhe zu Gemüte führen. Vermutlich wird da noch die ein oder andere Frage bei mir noch aufkommen
Zitat von
sirius:
Threadsteuerung mit Suspend und Resume zu machen ist nicht so gut und wird von M$ nicht empfohlen. Besser sind Events.
Okay, dann müsste ich mal schauen dass ich das umstricke... Welchen Vorteil hat denn die Lösung mit Events und WaitForSingleObject bzw. Waitfor gegenüber den suspenden?
Zitat von
sirius:
Was machst du, wenn dein GetDataThread den SaveDatathread einholt und beide auf das gleiche Array schreiben? Bzw.: Wie verhinderst du dies?
Tja, das ist echt ein Problem. Wenn der GetDataThread schneller ist als der SaveDatathread wir er ihn auf kurz über lang ja auf jeden einholen, egal wie groß der Ringbuffer ist. Das prüfe ich ja in der WndProc und im Fehlerfall gebe ich eine Messagebox aus. Zusätzlich muss ich da natürlich noch ErrorHandling betreiben, was hier im Code aber nicht vorhanden ist:
Delphi-Quellcode:
procedure TMainForm.WndProc(var Message: TMessage);
begin
if (Message.Msg = WM_GET_DATA_COMPLETE) then
begin
// Wenn Head(-index) <> Tail(-index) -> alles OK
if FRingBuffer.Head <> FRingBuffer.Tail then
begin
// SaveDataThread aufwecken um gerade bekommenen Daten auf HD zu speichern
FSaveDataThread.Resume;
end
else
begin
// Fehler. Head hat den Tail eingeholt :-(
MessageBox(0, pWideChar('Overrun!'), '', MB_ICONSTOP or MB_OK);
end;
end;
inherited;
end;