Thema: Delphi NetSend + Multithread

Einzelnen Beitrag anzeigen

Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

NetSend + Multithread

  Alt 18. Okt 2007, 14:57
Moin,

ich verwende, die unten aufgeführte Funktion, um eine NetSend Nachricht zu versenden. Ich möchte an ca. 1000 Computer etwas versenden. Da auch Computer Offline sein können, dauert das ewig und das Programm hängt sich auch auf. Nun habe ich mir überlegt, dass ich die Funktion in Thread übergeben könnte, der dann alleine läuft und das Hauptprogramm davon nichts mehr mitbekommt. Ich habe mir einige Tutorials zum Thread angeschaut. Werde aber nicht schlau draus.

Delphi-Quellcode:
function NetMessageBufferSendSubstA(ServerName, MsgName, FromName, Msg: AnsiString): Boolean;
{.$DEFINE SYNCHRONOUS}
const
  szService = '\mailslot\messngr';
  MaxBufLen = $700;
var
  hFile: THandle;
  WrittenBytes: DWORD;
{$IFNDEF SYNCHRONOUS}
  ovs: OVERLAPPED;
  EventName:String;
{$ENDIF}
begin
  Result := False;
  if Length(Msg) > MaxBufLen then
    SetLength(Msg, MaxBufLen);
{$IFNDEF SYNCHRONOUS}
  EventName:='NetSendEvent_'+ServerName;
{$ENDIF}
  ServerName := '\\' + Servername + szService;
  hFile := CreateFileA(
    @ServerName[1], GENERIC_WRITE, FILE_SHARE_READ, nil, OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING or FILE_FLAG_OVERLAPPED, 0);
  if hFile <> INVALID_HANDLE_VALUE then
  try
    Msg := FromName + #0 + MsgName + #0 + Msg;
{$IFNDEF SYNCHRONOUS}
    ovs.hEvent := CreateEventA(nil, True, False, @EventName[1]);
    WriteFile(hFile, Pointer(Msg)^, Length(Msg), WrittenBytes, @ovs);
{$ELSE}
    WriteFile(hFile, Pointer(Msg)^, Length(Msg), WrittenBytes, nil);
{$ENDIF}
    Result := GetLastError = ERROR_IO_PENDING;
  finally
{$IFNDEF SYNCHRONOUS}
    if WaitForSingleObject(ovs.hEvent, INFINITE) <> WAIT_TIMEOUT then
{$ENDIF}
      CloseHandle(hFile);
  end;
end;
Wenn mir einer einen Ansatz verraten würde, wäre ich erfreut. Ich habs mal mit:
CreateThread(nil, 0, TFNThreadStartRoutine(NetMessageBufferSendSubstA(Memo1.Lines[i], 'MsgName', 'FromName', 'Msg: AnsiString')), nil, 0, ThreadID); probiert aber das will nicht. Beim 2. Durchlauf kommt erscheint die CPU Seite bei Delphi. Warum auch immer und das Program hängt.

Gruß, Sven
  Mit Zitat antworten Zitat