Announcement

Collapse
No announcement yet.

Form in ActiveX-Exe verbraucht 100% CPU-Zeit

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • #16
    <p>unit2:</p>
    <p>unit Unit2;<br>
    <br>
    interface<br>
    <br>
    uses<br>
    ComObj, ActiveX, uas_TLB, StdVcl;<br>
    <br>
    type<br>
    Tgui = class(TAutoObject, Igui)<br>
    protected<br>
    procedure close; safecall;<br>
    procedure show(Skript, Version, Text: OleVariant); safecall;<br>
    { Protected declarations }<br>
    <br>
    end;<br>
    <br>
    implementation<br>
    <br>
    uses windows,Forms, ComServ,Unit3,Unit1,Registry;<br>
    <br>
    procedure Tgui.close;<br>
    begin<br>
    Form3.Free;<br>
    end;<br>
    <br>
    procedure Tgui.show(Skript, Version, Text: OleVariant);<br>
    Var Reg:TRegistry;<br>
    Key,mVersion:String;<br>
    begin<br>
    Form3 := Tform3.Create(Nil);<br>
    // Ab hier wird der Screen parametrisiert<br>
    Reg := TRegistry.Create;<br>
    Reg.Rootkey := HKEY_LOCAL_MACHINE;<br>
    If Reg.KeyExists('SOFTWARE\UAS') then<br>
    begin<br>
    Reg.Openkey('Software\UAS',False);<br>
    If Reg.ValueExists('sBaseKey') then<br>
    begin<br>
    Key := Reg.ReadString('sBaseKey');<br>
    Reg.CloseKey;<br>
    Reg.Openkey(Key,False);<br>
    If Reg.ValueExists('Version') then<br>
    begin<br>
    mVersion := Reg.ReadString('Version');<br>
    end<br>
    else mVersion := 'Unbekannt';<br>
    end<br>
    else mVersion := 'Unbekannt';<br>
    end<br>
    else mVersion := 'Unbekannt';<br>
    Reg.Free;<br>
    Form3.Caption := mVersion;<br>
    Form3.Panel3.Caption := text;<br>
    Form3.Hint := Skript+'('+Version+')';<br>
    Form3.show;<br>
    ShowWindow(Application.Handle,SW_HIDE);<br>
    Application.ProcessMessages;<br>
    end;<br>
    <br>
    <br>
    initialization<br>
    TAutoObjectFactory.Create(ComServer, Tgui, Class_gui,<br>
    ciSingleInstance, tmApartment);<br>
    end.<br>
    </p>
    <p>unit 3:</p>
    <p>unit Unit3;<br>
    <br>
    interface<br>
    <br>
    uses<br>
    Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,<br>
    jpeg, ExtCtrls, StdCtrls, ComCtrls;<br>
    <br>
    type<br>
    TForm3 = class(TForm)<br>
    Image1: TImage;<br>
    Panel1: TPanel;<br>
    Panel2: TPanel;<br>
    Panel3: TPanel;<br>
    procedure FormShow(Sender: TObject);<br>
    private<br>
    { Private declarations }<br>
    public<br>
    { Public declarations }<br>
    end;<br>
    <br>
    var<br>
    Form3: TForm3;<br>
    <br>
    implementation<br>
    <br>
    {$R *.DFM}<br>
    <br>
    <br>
    <br>
    procedure TForm3.FormShow(Sender: TObject);<br>
    begin<br>
    Application.ProcessMessages;<br>
    end;<br>
    <br>
    end.<br&gt

    Comment


    • #17
      Hallo,

      bevor ich mich auf die Suche innerhalb der VCL begebe, kann es etwa sein, dass die CPU-Last von der Schleife aus dem VBScript-Makro kommt?
      <pre>
      Dialog.Show "testskript.vbs","1.0",text
      for i = 1 to 12000000
      next
      Dialog.close
      </pre>
      Wenn dieses Makro aus dem WSH (Windows Scripting Host) heraus aufgerufen werden soll, würde ich auf <b>WScript.Sleep(100)</b> zurückgreifen, um die Zeitdauer der Wartezeit festzulegen

      Comment


      • #18
        Die VBScript schleife ist nur ein Platzhalter für weitere Aufgaben und nur als Beispiel. Sobald die Form angezeigt wird, geht die CPU-Zewit auf 99-100

        Comment


        • #19
          Hallo,

          ich habe diesen Fall einmal nachgebaut: <br>
          a) Local Server (EXE) implementiert ein Automation-Objekt <br>
          b) Application.ShowMainForm := False; (Server-Formular nicht anzeigen) <br>
          c) Delphi-Client kann über eine Interface-Methode ein Formular im Server erzeugen und über <b>Show</b> nichtmodal anzeigen <br>
          d) Delphi-Client kann über eine weitere Interface-Methode das sichtbare Server-Formular zerstören und Daten auslesen <br>
          Wenn das nichtmodale Formular angezeigt ist, ist die CPU-Auslastung unter Windows NT nahe der Null-Linie. Somit ist das in der Frage gestellte angesprochene Problem nicht reproduzierbar.

          Local Server-Projektdatei:
          <pre>
          begin
          Application.Initialize;
          Application.ShowMainForm := False;
          Application.CreateForm(TFormServer, FormServer);
          Application.Run;
          end.
          </pre>
          Local Server-Implementierung:
          <pre>
          type
          TFrmInExeObj = class(TAutoObject, IFrmInExeObj)
          private
          FFormServer : TFormServer;
          protected
          procedure DestroyForm(out sMsg: WideString); safecall;
          procedure ShowForm(hParentWnd: Integer); safecall;
          { Protected-Deklarationen }
          end;

          implementation

          uses ComServ;

          procedure TFrmInExeObj.ShowForm(hParentWnd: Integer);
          begin
          Application.Handle := hParentWnd;
          FFormServer := TFormServer.Create(nil);
          FFormServer.Show;
          end;

          procedure TFrmInExeObj.DestroyForm(out sMsg: WideString);
          begin
          sMsg := FFormServer.Edit1.Text;
          FFormServer.Release
          end;
          </pre>

          &#10

          Comment


          • #20
            Hallo Andreas

            ich konnte dein Beispiel leider nicht nachvollziehen.
            Kann ich den Quellcode deines Beispielprojektes komplett bekommen ?

            Comment


            • #21
              Hallo,

              was geht an diesem Beispiel nicht

              Comment

              Working...
              X