01. oktober 2003 - 19:28Der er
6 kommentarer og 1 løsning
Afventer programstart.
Jeg er i gang med at lave et program, som skal starte et par programmer op i en bestemt rækkefølge! Til dette bruger jeg ShelleExecute(). Lad os f.eks. sige at jeg skal starte fem programmer op, kaldet Program1, Program2 osv.
Denne række følge skulle de også gerne vise sig i nede på proceslinien, men eftersom program3 starter hurtigere op end hhv. program 1 og 2 ligger denne først på proceslinien.
Mit spørgsmål lyder så på om, men kan indsætte en kode efter ShellExecute(), som går ind og afventer at program1 er eksekveret.
Altså afventer programstart før næste fil eksekveres.
Jeg har været inde og kigge på de pågældende eksempler før jeg skrev mit eget indlæg, men de opfylder desværre ikke helt mit behov.
Jeg ønsker ikke at venter på at program1 afsluttes, men blot at det er startet op! Alle fem programmer skal køre på samme tid, og skal placeres i en bestemt rækkefølge på proceslinien.
Det er godt nok lidt af en "lappe løsning", men det burde som sådan virke. Du kan lave en timer der kører f.eks. hvert 5. sek og så starter programmet op alt efter hvad en counter indeholder. F.eks. som nedenstående:
procedure TForm1.Timer1Timer(Sender: TObject); begin If ProgramCounter = 1 Then Begin ShellExecute(Handle, nil, PChar(Program1), nil, nil, SW_SHOW); Inc(ProgramCounter); End Else If ProgramCounter = 2 Then Begin ShellExecute(Handle, nil, PChar(Program2), nil, nil, SW_SHOW); Inc(ProgramCounter); End Else If ProgramCounter = 3 Then Begin ShellExecute(Handle, nil, PChar(Program3), nil, nil, SW_SHOW); Inc(ProgramCounter); End Else If ProgramCounter = 4 Then Begin ShellExecute(Handle, nil, PChar(Program4), nil, nil, SW_SHOW); Inc(ProgramCounter); End Else If ProgramCounter = 5 Then Begin ShellExecute(Handle, nil, PChar(Program5), nil, nil, SW_SHOW); ProgramCounter := 1; End; end;
En primitiv måde var at lade hvert program oprette en bestemt fil, som tegn på, at de er oppe at køre, og så lade hovedprogrammet teste på, om filen eksisterer.
I pseudokode noget i stil med:
for pgmnbr:=1 to 5 delete file; start program number pgmnbr repeat wait a sec; until file exists; end;
Og de kaldte programmer skal så bare oprette filen som det første.
Det kan formentlig give nogle problemer, hvis hovedprogrammet prøver at slette filen, før underprogrammet har fået lukket den, så alternativt kunne man sende et tal over som parameter til hvert af de kaldte programmer, og de skal så oprette en fil, hvor tallet indgår i navnet. Hvis man skal opføre sig pænt, så prøver hovedprogrammet at slette filerne til sidst, før det afslutter, men det er ikke kritisk for metoden, idet filerne jo slettes, før underprogrammerne aktiveres.
Ups - jeg manglede en linje i pseudokoden. Efter "until file exists;" havde jeg tænkt en linje med "delete file;". Det er årsagen til min kommentar om, at det måske kan give enqueue-problemer at forsøge at slette den.
Jeg har selv løst problemet - eller dvs. jeg bruger bare min første løsning (selvom jeg mener det er dårlig programmerling)
//Oergaard
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.