Sto tentando di mostrare una schermata iniziale e di non bloccare l'applicazione mentre si connette a un database. Le connessioni normali (a MSSQL tramite ADO) richiedono circa 300 msec, e ciò non fa in modo che il thread principale mostri "non risponde" su Windows.Mostra una schermata iniziale mentre è in esecuzione una connessione al database (che potrebbe richiedere molto tempo)
Tuttavia, nel caso di (a) un errore di rete o (b) un errore di configurazione (nome host/istanza del server SQL non valido), occorrono 60 secondi per il timeout. Ciò non solo rende l'applicazione non reattiva, ma è quasi impossibile mostrare qualsiasi errore o messaggio quando si bloccherà. Potrei far apparire un messaggio prima di iniziare la connessione ma non c'è davvero alcuna soluzione quando il thread principale blocca per 60 secondi.
La soluzione sembra essere quella di spostare la connessione a un thread in background. Questo ha portato al seguente codice:
un TThread di classe che rende il collegamento di fondo e alcuni SyncObj come un tID utilizzata per inviare un segnale al thread principale.
Un ciclo nel thread principale con questo codice:
BackgroundThread.StartConnecting; while not BackgroundThread.IsEventSignalled do begin Application.ProcessMessages; // keep message pump alive. end; // continue startup (reports error if db connection failed)
E 'questa la strada giusta da percorrere? Le mie esitazioni riguardano i seguenti elementi della soluzione di cui sopra:.
A. sarei chiamando Application.ProcessMessages, che io considero un codice di odore estrema (Questo potrebbe essere un'eccezione ammessa a questa regola)
B. Sto introducendo i thread nell'avvio di un'applicazione, e sono preoccupato di introdurre bug.
Se qualcuno ha un'implementazione di riferimento che è noto per essere privi di condizioni di competizione, che può fare una connessione in background con ADO, ed è noto per essere un approccio sicuro, sarebbe davvero utile. In caso contrario, consigli generali o esempi parziali sono buoni.
Dato che una connessione normale richiede solo 300ms, perché non modificare il timeout (ad esempio 1000 ms)? – awmross
Come visualizzare la schermata iniziale dal thread in background: http: // StackOverflow.it/questions/388506/display-splash-screen-in-delphi-when-main-thread-is-busy – Harriv
Questo problema è uno dei principali casi d'uso per mostrare l'interfaccia utente da un thread diverso dal thread principale della GUI –