Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
Delphi XE2 Professional
|
NetSend + Multithread
18. Okt 2007, 15: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
|
|
Zitat
|