Einzelnen Beitrag anzeigen

Benutzerbild von APP
APP

Registriert seit: 24. Feb 2003
Ort: Graz (A)
705 Beiträge
 
Delphi 7 Enterprise
 
#4
  Alt 8. Apr 2003, 12:44
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;
Armin P. Pressler

BEGIN
...real programmers are using C/C++ - smart developers Delphi;
END;
  Mit Zitat antworten Zitat