Jump to content


This is a ready-only archive of the InstallSite Forum. You cannot post any new content here. / Dies ist ein Archiv des InstallSite Forums. Hier können keine neuen Beiträge veröffentlicht werden.
Photo

Multithreading


5 replies to this topic

Dietmar

Dietmar
  • Members
  • 21 posts

Posted 01 March 2001 - 13:28

Hallo,
Folgende Situation:
Nachdem des Setup alle Dateien installiert hat, rufe ich nit LaunchApp ein *.exe auf, das Anweisungen zu einer Datenbankerstelung (create table usw. ) ausführt. Dies kann evtl. sehr lange dauern.
Um den Fortschritt dieses Vorgangs dem User anzuzeigen, habe ich eine Progressbar eingerichtet.
Die Anwendung *.exe übergibt an die Registry laufend Werte, die vom Setup ausgelesen werden und an die Progressbar übergeben werden:
  nCount        = 0;                    
   while (nCount <= 99)
    // RegDBGetKeyValueEx function retrieves the value of
    // a particular value name under a specified key in the registry.  
       RegDBGetKeyValueEx(szKey, szBfsProgress, nvType, svCount, nvSize);      
       RegDBGetKeyValueEx(szKey, szBfsAction, nvType, svValue, nvSize);
 
     szString = svCount;      
     StrToNum(nVar, szString);
   
     nCount = nVar;
        SetStatusWindow(nCount, svValue);
   endwhile;
Dies funktioniert auch alles wunderbar.
Das Problem:
Ich habe eine Dialobox (Progressbar) mit Abbrechen-Button ausgewählt.
Solange sich das Setup in der Schleife befindet, ist kein Zugriff auf den Abbrechen-Button möglich.
Dies sollte aber für den User möglich sein.
Frage:
Gibt es eine Möglichkeit dieses Problem mit einem zweiten Thread  zu lösen? Ich habe dazu in der IS-Hilfe nichts gefunden.
Oder kann man das Ganze evtl. völlig anders in den Griff kriegen?
Für Vorschläge wäre ich sehr dankbar.
Dietmar


Stefan Krueger

Stefan Krueger

    InstallSite.org

  • Administrators
  • 13,269 posts

Posted 01 March 2001 - 16:36

Auf InstallShield's Progress-Bar (STATUS_EX etc.) Dialogen funktioniert der Cancel-Button nur während der Datenübertragung. Die Alternative wäre ein eigener Dialog (evtl. im gestarteten Programm). Das Pollen der Registry dürfte das System auch ziemlich bremsen (zumindest solltest Du ein Delay einbauen).

Jan Becker

Jan Becker
  • Members
  • 285 posts

Posted 02 March 2001 - 15:24

also wenn der standarddialog kein event schickt, dann koenntest du:


  • mit CtrlGetState(dialogname, id des abbruch-buttons) staendig auf dem status pollen. dazu dient diesselbe schleife, die auch die registry liest.
    problem: ich kenne weder den namen des statusdialogs, noch die id des abbruchbuttons. duerfte aber rauszukriegen sein.

  • einen eigenen dialog bauen. dann kennst du alle namen und id's der bestandteile und kannst wie in 1. verfahren.

  • ueberlasse das anzeigen des status' der exe, die den datenbankkram erledigt. dazu wuerde ich ihr das windowhandle von IS (GetWindowHandle(HWND_INSTALL))als parameter uebergeben, fuer die die exe dann ein childwindow erstellt. das eventhandling des buttons geschieht dann in der exe. in IS stellst du dann die dialoge ab (geht das?).

vielleicht klappts,
jan

(Edited by Jan Becker at 3:42 pm on Mar. 2, 2001)


Dietmar

Dietmar
  • Members
  • 21 posts

Posted 05 March 2001 - 15:28

Hallo,
Die Ideen gefallen mir eigentlich ganz gut, aber:
1. Wie bekommt man den Namen einer Dialogbox?
Die ID der Dialogbox (10305) ist mir bekannt, ebenso die ID der Steuerelemente (Fortschrittssanzeige 1500 und Abbrechen 2)
2. Ich habe eine benutzerdefinierte Dialogbox erstellt, mit EzDefineDialog. Um diese Dialogbox anzuzeigen rufe ich WaitOnDialog auf, und nun habe ich das Problem Werte an das Steuerelement Fortschrittssanzeige (1500) zu übergeben.
CtrlSetState taugt dafür nicht.
SetStatusWindow taugt auch nicht, ich vermute diese Funktion bezieht sich nicht auf benutzerdefinierte Progressbars.
3. Kann man eine Dialogbox mit einer anderen Funktion als WaitOnDialog anzeigen?
Danke vorab
Dietmar

(Edited by Dietmar at 3:32 pm on Mar. 5, 2001)


Jan Becker

Jan Becker
  • Members
  • 285 posts

Posted 06 March 2001 - 10:52

gute frage. ich habe leider auch nix gefunden, womit man den status des progessbars setzen koennte. aus diesem grund nehme ich halt immer den direkten weg, d.h die winapi bzw. die mfc. entspricht punkt 3.

wegen dem namen hab ich mal im dialogsampler rumgesucht, aber so richtig auch nichts gefunden. vielleicht im IS verzeichnis die includes oder sonstwas durchforsten.