Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Thread erzeugen (https://www.delphipraxis.net/57241-thread-erzeugen.html)

Van HelF 17. Nov 2005 17:11


Thread erzeugen
 
Ich möchte folgenden code gerne gesondert als thread laufen lassen, da bei der suche das form nicht mehr reagiert, nun ist meine frage, wie ich dies am einfachsten und schnellsten lösen könnte.
Ich möchte dazu noch sagen dass ich nicht zu bequem war im forum nach lösungsansätzen zu suchen , aber da ich jetzt seit etwa einer woche versuche etwas zu basteln und nur massenweise fehlermeldungen erhalte, bitte ich euch um eueren rat.

Code:
Delphi-Quellcode:

type
  PNetResourceArray = ^TNetResourceArray;
  TNetResourceArray = array[0..100] of TNetResource;

function CreateNetResourceList(ResourceType: DWord;
                              NetResource: PNetResource;
                              out Entries: DWord;
                              out List: PNetResourceArray): Boolean;
var
  EnumHandle: THandle;
  BufSize: DWord;
  Res: DWord;
begin
  Result := False;
  List := Nil;
  Entries := 0;
  if WNetOpenEnum(RESOURCE_GLOBALNET,
                  ResourceType,
                  0,
                  NetResource,
                  EnumHandle) = NO_ERROR then begin
    try
      BufSize := $4000; // 16 kByte
      GetMem(List, BufSize);
      try
        repeat
          Entries := DWord(-1);
          FillChar(List^, BufSize, 0);
          Res := WNetEnumResource(EnumHandle, Entries, List, BufSize);
          if Res = ERROR_MORE_DATA then begin
            ReAllocMem(List, BufSize);
          end;
        until Res <> ERROR_MORE_DATA;

        Result := Res = NO_ERROR;
        if not Result then begin
          FreeMem(List);
          List := Nil;
          Entries := 0;
        end;
      except
        FreeMem(List);
        raise;
      end;
    finally
      WNetCloseEnum(EnumHandle);
    end;
  end;
end;

procedure ScanNetworkResources(ResourceType, DisplayType: DWord; List: TStrings);

procedure ScanLevel(NetResource: PNetResource);
var
  Entries: DWord;
  NetResourceList: PNetResourceArray;
  i: Integer;
begin
  if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList) then try
    for i := 0 to Integer(Entries) - 1 do begin
      if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or
        (NetResourceList[i].dwDisplayType = DisplayType) then begin
        List.AddObject(NetResourceList[i].lpRemoteName,
                      Pointer(NetResourceList[i].dwDisplayType));
      end;
      if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then
        ScanLevel(@NetResourceList[i]);
    end;
  finally
    FreeMem(NetResourceList);
  end;
end;

begin
  ScanLevel(Nil);
end;   

procedure TForm1.BitBtn2Click(Sender: TObject);
begin
ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, ListBox1.Items);
end;

Luckie 17. Nov 2005 17:13

Re: Thread erzeugen
 
Ruf einfach in der Thread-Funktion oder in der Execute-Methode des Thread-Objekts deine Routine auf. Du musst nur die Zugriffe auf VCL Elemente Synchronisieren.

Van HelF 17. Nov 2005 17:15

Re: Thread erzeugen
 
Ok, ich sollte vielleicht noch dazu sagen dass ich (noch) keinerlei ahnung von thread programmiererei habe

Luckie 17. Nov 2005 17:16

Re: Thread erzeugen
 
Ich dachte, du hättest dich im Forum informiert. Da solltest du eiegntlich was aufgeschnappt haben. Ansonsten: http://delphitutorials.luckie-online.de


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz