2011-10-28 12 views
5

Ho una discussione, chiamata TAlertThread. Il thread interagisce con il proprietario attivando eventi. Ad esempio, quando determinati dati sono disponibili all'interno del thread, imposta alcune variabili temporanee e chiama Synchronize (UpdateAlert) che a sua volta attiva l'evento appropriato.Delphi - Thread non in esecuzione nel form ActiveX - ma altrove

Ora il thread funziona perfettamente in qualsiasi applicazione Windows standard. Il mio problema è quando inserisco quel thread all'interno di un form ActiveX (TActiveForm). Il controllo ActiveX (noto anche come oggetto COM) viene quindi incorporato all'interno di un gadget di Windows Desktop (tramite HTML/Javascript). Ho anche esperienza con questo, il gadget non è il problema. Il componente ActiveX funziona correttamente nella sua destinazione, ad eccezione del fatto che il thread non viene mai eseguito. Viene persino chiamato ESATTAMENTE nello stesso modo in cui l'ho chiamato dall'App.

Questa è una limitazione con ActiveX, che impedisce l'esecuzione dei thread? Non lo penserei, perché funzionano altre cose che richiedono thread internamente (come TADOConnection). In effetti sto correttamente chiamando CoInitialize e CoUninitialize in modo appropriato. Di nuovo, funziona perfettamente in un'applicazione, ma non funziona affatto in ActiveX.

Ecco come io chiamo questa discussione ...

procedure TRMPDashXS.ExecThread; 
begin 
    //Thread created suspended 
    lblStatus.Caption:= 'Executing Thread...'; 
    fThread:= TAlertThread.Create(fConnStr); //fConnStr = connection string 
    fThread.Priority:=  tpIdle; 
    fThread.OnConnect:=  Self.ThreadConnected; 
    fThread.OnDisconnect:= Self.ThreadDisconnected; 
    fThread.OnBegin:=  Self.ThreadStarted; 
    fThread.OnFinish:=  Self.ThreadFinished; 
    fThread.OnAlert:=  Self.ThreadAlert; 
    fThread.OnAmount:=  Self.ThreadAmount; 
    fThread.Resume; //Execute the thread 
end; 
+0

Per chiarire, intendo "Non funziona" come nella procedura Esegui non viene mai chiamato dal thread. –

+0

Umm .. manca l'override sulla dichiarazione del metodo di esecuzione? Solo una supposizione: non ho mai visto accadere nulla di simile. I miei thread raggiungono sempre la prima riga del metodo di esecuzione prima di esplodere. –

+0

Oh - 'tpIdle'. Prova ad accedervi in ​​tpNormal, solo per ora .. –

risposta

7

ho il sospetto che questo potrebbe descrivere esattamente quello che stai vivendo nella versione di Delphi:

Non sono sicuro se questo aiuti ... ma spero che lo faccia. Almeno un po ':)

PS: C'è un motivo particolare che ti ha usare Com/ActiveX e/o TActiveForm?

+1

+1 Questi articoli spiegano i problemi a cui alludevo nei commenti. –

+0

Il mio motivo particolare era perché A) Delphi è la mia lingua principale, B) prodotto deve essere in un gadget, C) Delphi supporta facilmente la creazione di moduli ActiveX, e D) I COULD utilizzare AJAX in questo gadget, ma non voglio implementare un Server HTTP per farlo. Questo controllo ActiveX si connette direttamente a un database SQL. Potrei finire per abbandonare l'idea di creare un gadget e invece di creare un'applicazione per i vassoi (nascosta fino al momento necessario). L'obiettivo è di fornire avvisi/notifiche all'utente per il nostro software, quando il software non è in esecuzione. Il software utilizza il database SQL e javascript non può connettersi a SQL. –

+0

Forse il tuo controllo ActiveX non sarà in grado di comunicare con il database SQL. Se il tuo prodotto è remoto e se c'è uno o più firewall tra il tuo cliente e SQL Server della tua azienda che non hai il controllo, allora sei SOL. D: Hai davvero bisogno di TActiveForm (ri: la tua domanda originale). D: Hai veramente bisogno del server SQL? E se sì, può essere un SQL Server * locale * (incorporato), che è letteralmente installato sul desktop del cliente (e non ha bisogno di comunicare con qualcos'altro)? – paulsm4

0

Secondo questo articolo qui: i browser web http://edn.embarcadero.com/article/32756 non permettono threading via ActiveX. Tuttavia, ciò non spiega ancora perché non funziona quando lo inserisco in un'applicazione C#.

Problemi correlati