multithreading - Creating NewTask in a For Loop using Omnithread Library -
am writing program detects usb insertion , saves inserted drive(s) stringlist. want create newtask or background worker each content of stringlist, start them , wait till task finishes using omnithread library.
here code snippet
uses winapi.windows, winapi.messages, system.sysutils, system.classes, winapi.shellapi, otlcommon, otlcollections, otlparallel, vcl.dialogs; procedure tusb.wmdevicechange(var msg: tmessage); var lpdbhheader: pdevbroadcastheader; resstringlist, tempsenderlist: tstringlist; i: integer; begin lpdbhheader := pdevbroadcastheader(msg.lparam); resstringlist := tstringlist.create; tempsenderlist := tstringlist.create; resstringlist.clear; tempsenderlist.clear; try case msg.wparam of dbt_devicearrival: begin if (lpdbhheader^.dbch_devicetype = dbt_devtyp_volume) begin sleep(2000); // procedure connected usb devices , save stringlist (getdrive(pdevbroadcastvolume(msg.lparam), resstringlist)); := 0 resstringlist.count - 1 begin { how create newtask or background worker each content in resstringlist execute walkdirectory , parallel.foreach(0, tempsenderlist.count - 1) in newtask? } // procedure recurse content of usb drive , save tempsenderlist walkdirectory(excludetrailingpathdelimiter(resstringlist.strings [i]), tempsenderlist); parallel.foreach(0, tempsenderlist.count - 1).execute( procedure(const value: integer) begin // dosomething(tempsenderlist[value]); end); showmessage(tempsenderlist.text); end; end; end; dbt_deviceremovecomplete: begin if (lpdbhheader^.dbch_devicetype = dbt_devtyp_volume) begin // showmessage('removed'); end; end; end; resstringlist.free; tempsenderlist.free; end; end;
using delphi xe7 , omnithread library v3.04.
Comments
Post a Comment