Danke @Motzi und @Luckie,
aber ich komme mit den Threads und Eueren Tips nicht klar
(bin noch Thread-Anfänger)
Ich übergebe iNumberOfThreads beim 1. Aufruf in meiner Form1-
Unit mit:
Delphi-Quellcode:
iNumberOfThreads := 0;
FOR i := 0 TO ListBox1.Items.Count - 1 DO //Maximal 16 THREADS zugleich!!!
BEGIN
...
TFlappPrintThread.Create(sFile, i, ListBox1, iNumberOfThreads);
...
END;
...
WHILE CloseIt DO
BEGIN
Application.ProcessMessages;
Label1.Caption := IntToStr(iNumberOfThreads); // HIER SOLLTE DIE ANZAHL DER OFFENEN THREADS STEHEN -ist aber immer Null :-((
Application.ProcessMessages;
Form1.Refresh;
Application.ProcessMessages;
END;
in meiner Thread-
Unit mache ich dann das:
Delphi-Quellcode:
CONSTRUCTOR TFlappPrintThread.Create(CONST aFile: STRING; CONST aThreadID: Integer; aListBox: TListBox; iNumberOfThreads: Integer);
BEGIN
FaListbox := aListBox;
FaThreadID := aThreadID;
FiNumberOfThreads := iNumberOfThreads;
FaFile := aFile;
FreeOnTerminate := true; // Thread freigeben, wenn beendet
INHERITED Create(false); // False = sofort starten
END;
Delphi-Quellcode:
PROCEDURE TFlappPrintThread.Execute;
VAR
ShExecInfo : TShellExecuteInfo;
BEGIN
InterlockedIncrement(FiNumberOfThreads); // INTERLOCK++
TRY
IF NOT FileExists(FaFile) THEN
BEGIN
MessageDlg('File: ' + FaFile + ' not found', mtError, [mbOk], 0);
END;
FillChar(ShExecInfo, SizeOf(ShExecInfo), 0);
WITH ShExecInfo DO
BEGIN
cbSize := SizeOf(ShExecInfo);
fMask := SEE_MASK_NOCLOSEPROCESS; // SEE_MASK_NOCLOSEPROCESS OR SEE_MASK_FLAG_DDEWAIT;
lpFile := PChar(FaFile);
lpVerb := 'print';
nShow := SW_HIDE; //SW_SHOW;
END;
IF ShellExecuteEx(@ShExecInfo) THEN
BEGIN
WaitForSingleObject(ShExecInfo.hProcess, INFINITE); //0
Synchronize(SyncListbox);
InterlockedDecrement(FiNumberOfThreads); // INTERLOCK--
END
ELSE
ShowMessage('Fehler beim Öffnen');
FINALLY
Terminate; // dann beenden
END;
END;