`m en utilisant Delphi XE6 et UniDAC et MySQLActualiser requêtes dans Threads
J'ai quelques composants TUniQuery dans mon DM et je veux Actualisez le thème à plusieurs reprises, donc je mets des minuteries dans ma principale forme et dans chaque minuterie Je crée un fil et passer une requête pour des données rafraîchissante:
pour l'exemple:
TUpdateThread = class(TThread)
private
FQuery : TUniQuery;
FResultHandle : THandle;
public
constructor Create(var Query : TUniQuery; ResultHandle : THandle);
protected
procedure Execute; override;
end;
constructor TUpdateThread.Create(var Query: TUniQuery; ResultHandle : THandle);
begin
inherited Create;
Suspend;
FQuery := Query;
FResultHandle := ResultHandle;
FreeOnTerminate := True;
Resume;
end;
procedure TUpdateThread.Execute;
var
Msg : String;
B : Boolean;
begin
try
B := True;
try
FQuery.Refresh;
except
on E:Exception do
begin
B := False;
Msg := 'Error : ' + #13 + E.Message;
SendMessage(FResultHandle, MSG_UPDATERESULT, 2, Integer(Msg));
end;
end;
finally
if B = True then
SendMessage(FResultHandle, MSG_UPDATERESULT, 1, 1);
Terminate;
end;
end;
Parfois, il s `fait avec succès, mais plusieurs fois je suis arrivé quelques erreurs telles que ou AVs « net pack de tête. .. "erreur ou parfois j'ai proble m dans mes grilles (Ehlib DBGrid) comme une erreur dans les lignes de dessin ou ... (spécialement quand j'utilise DisableControls et EnableControls) Toutes les requêtes ont la même connexion, je pense que chaque thread doit avoir sa propre connexion, à cause de tous les intervalles de temporisation sont les mêmes, je suggère des requêtes parfois rafraîchissantes les interruptions les uns des autres
en fait, ma base de données est un serveur VPS et il y a des applications clientes, je veux avoir en direct-tables dans les clients et le thème de la mise à jour à plusieurs reprises
Qu'est-ce que est le meilleur moyen d'y parvenir? comment je devrais mettre à jour mes tables sans application se bloque! il y a quelques composants comme TThreadTimer (ou ...), le thème est-il utile pour cette situation?!
... merci
N'utilisez pas de suspension/reprise. Ces méthodes sont obsolètes.Au lieu de cela, créez le thread suspendu et lancez-le lorsque l'initialisation est terminée. – Johan
N'envoyez pas 'SendMessage' depuis votre thread. Considérez ce qui se passe si le récepteur est bloqué sur son traitement. Utilisez 'PostMessage' ou' SendMessageTimeout' pour vous assurer que votre thread ne mourra pas sur cette ligne. C'est pourquoi 'Synchronize' n'est pas implémenté comme un simple appel de fonction. – TLama
@TLama: mais PostMessage a envoyé un message dans la file d'attente messae et avoir du retard! , plusieurs fois quand je crée un fil, je montre une fenêtre en attente et il n'y a pas de travail jusqu'à ce que le message arrive –