| |
|
|
Thomas Freier | Während sich das Hauptprogramm aufbaut (normal ca. 1s) und dann in der Warteschleife ist, soll ein mit Shell gestartetes Such-Programm (hier Avery.exe genannt) überprüfen, ob und wo eine bestimmte *.exe vorhanden ist. Nach Rechnerneustart und Aufruf des Hauptprogramms verharrt es ca. 25s und reagiert nicht. Eigentlich soll doch das Hauptprogramm weiter bedienbar bleiben. Nach erneutem Start des Hauptprogramms verharrt es nur noch ca. 4s. Ist das nur bei mir so oder wo mache ich einen Fehler? Minibeispiel KompilierenMarkierenSeparieren $P+
SetErrorLevel 0
DEF GETSYSCOLOR(1) !"USER32","GetSysColor"
DECLARE T&,TAB1&,TAB2&
DECLARE EDIT1&,EDIT2&,EDIT3&
DECLARE ELEMENT1&,ELEMENT2&,ELEMENT3&
WINDOWSTYLE 538
WINDOWTITLE "Tabtest"
WINDOW 209,169-500,250
SETTRUECOLOR 1
DECLARE ENDE%
CLS GETSYSCOLOR(15)
USEFONT "MS Sans Serif",13,0,0,0,0
SETDIALOGFONT 1
T& = CREATE("TABCTRL",%HWND,"Reiter1",0025,0027,0395,0172)
TAB1&=@InsertTab(T&,1,"Reiter2")
TAB2&=@InsertTab(T&,2,"Reiter3")
ELEMENT1&=Control("STATIC","",$54001106,10,30,200,100,t&,0,%hinstance,$0)
EDIT1&=Create("Edit",ELEMENT1&,"TAB 0",10,10,100,18)
ELEMENT2&=Control("STATIC","",$54001106,10,30,200,100,t&,0,%hinstance,$0)
EDIT2&=Create("TEXT",ELEMENT2&,"TAB 1",10,10,100,18)
ELEMENT3&=Control("STATIC","",$54001106,10,30,200,100,t&,0,%hinstance,$0)
EDIT3&=Create("BUTTON",ELEMENT3&,"TAB 3",10,10,100,18)
Zuerst nur das erste anzeigen:
Showwindow(Element1&,1)
Showwindow(Element2&,0)
Showwindow(Element3&,0)
Shell "Avery.exe" prüft wo notepad.exe vorhanden ist.
Ergebnis in der AVREY.INI
SETFOCUS(%HWND)
WHILENOT ENDE%
WAITINPUT
If %KEY=2
ENDE%= 1
ELSEIF TABCHANGED(T&) TABCTRL
IF GetActiveTab(T&) = 0
Showwindow(Element1&,1)
Showwindow(Element2&,0)
Showwindow(Element3&,0)
ELSEIF GetActiveTab(T&) = 1
Showwindow(Element1&,0)
Showwindow(Element2&,1)
Showwindow(Element3&,0)
ELSEIF GetActiveTab(T&) = 2
Showwindow(Element1&,0)
Showwindow(Element2&,0)
Showwindow(Element3&,1)
ENDIF
ENDIF
href='./../../function-references/xprofan/wend/'>WEND
Suchprogramm KompilierenMarkierenSeparierenDef Searchtreeforfile(3) !"imagehlp","SearchTreeForFile"
Def GetLogicalDrives(0) !"KERNEL32","GetLogicalDrives"
Def GetDriveType(1) !"KERNEL32","GetDriveTypeA"
Declare buf#, Buffer#
Dim buf#,4
Dim Buffer#,261
var f.File$= "note-pad.exe" wegen der Suchdauer geändert
Declare drives&,i%,f.Root$,f.Rück&
drives&=GetLogicalDrives()
While (i%<26)
If TestBit(drives&,i%)
f.Root$=Chr$((i%+65));":"
String buf#,0=f.Root$
If GetDriveType(buf#)=3
Clear Buffer#
f.Rück& = @Searchtreeforfile(@Addr(f.Root$), @Addr(f.File$), Buffer#)
case f.RÜck& <> 0: BREAK
EndIf
clear buf#
EndIf
Inc i%
Wend
WRITEINI $ProgDir+"\AVERY.INI","Avery","DirPfad"=String$(Buffer#,0)
Dispose Buffer#
Dispose buf#
End
|
|
|
| |
|
|
|
| Wenn nach shell die aufrufende Anwendung verharrt, gibt Windows dem Aufrufer wohlmöglich halt grad keine Priorität oder es meint, dass eben andere Dinge grad wichtiger sind bzw. zunächst abgearbeitet werden müssen. Du kannst nicht davon ausgehen, dass Prozesse oder Threads Schritt per Schritt nebeneinander herlaufen - eher ist das Gegenteil der Fall. Einen logischen Fehler habe ich beim Überfliegen vom Code nicht erkannt, sodass ich einfach sagen würde, der Rechner "ackert" halt - besonders frisch nach dem Hochfahren - und besonders weil Dein Suchthread so ganz ohne WaitInput gerne sowieso am liebsten volle Last in Anspruch nimmt. ^^ (vlt. würde einfach nach While (i%<26) ein WaitInput 1 helfen) |
|
|
| |
|
|
|
Thomas Freier | Hat alles nicht viel geändert. Werde einfach nur bei Bedarf nachprüfen, wenn die erforderliche ext. Software gebraucht wird, ob sie noch im einmal ermittelten Ordner vorhanden ist. |
|
|
| |
|
|