![]() |
Thread in Anwendung verursacht EAVoilation
Hallo,
habe da ein kleines bis mittelgrosses Problem. Ich schreibe einen Bot für ein Online Game. Die Ausganskomponente ist nicht das beste, damit ich aber Funktionen nutzen kann muss ich sie in Threads auslagern (Pro Befehl einen Thread). Da ich später evtl. das ganze in DLL's auslagern will um es Modular zu gestalten, hab ich bereits angefangen es umzubauen. Das Synchronize des Threads verweist auf eine Function innerhalb des Hauptprogrammes.
Delphi-Quellcode:
Die Configuration ist in einem Record hinterlegt.
Function TCore_Form.HandleThreadMessages(IsCommand: Boolean; Msg: String): Boolean;
Begin Msg := FormatOutgoing(Msg); AOChat.SendGroup('Point of no Return', 'Test'); If Config.Parse AND (IsCommand OR Not IsCommand) Then Begin AOChat.PrivateGroupMessage(Config.Charname, Msg); Msg := ReplaceHTML(Msg); IRCSocket.Socket.SendText( Format(ReturnAOMsg, [Config.BotNick, Config.AONick, '', Msg]) ); End; End;
Delphi-Quellcode:
Er ist in einer Unit auf die alle Zugriff haben. Geladen wird die Konfiguration dann
Type
TConfig = Record { AOChat } Username : String; // Benutzername Passwort : String; // Passwort Dimension : String; // Dimension Charname : String; // Charactername Organisation : String; // { IRC } IRCEnabled : Boolean; // IRC Komunikation aktiv IRCServer : String; // IRC Server Host IRCPort : Integer; // IRC Server Port IRCPass : String; // IRC Server Passwort BotChan : String; // Channel in dem der Bot sitzt BotChanPass : String; // Passwort zum Channel BotNick : String; // Nickname des Bots BotNickAlt : String; // Alternativname == Nickname + Prefix AONick : String; // Nick der in AO angezeigt wird IRCNick : String; // Nick der im IRC angezeigt wird Parse : Boolean; // Abfragen übergeben { Befehlsinterpreter } CMD : String; // Interpreter für die Befehle ! , . : {} BotOwner : String; End;
Delphi-Quellcode:
Constant.GetConfiguration(Config);
Delphi-Quellcode:
So schauts in der Constant.pas aus.
Function GetConfiguration(Var LConfig: TConfig): Boolean;
Jedesmal wenn ich aus dem Thread die Function aufrufe kommt es zu einer Zugriffsverletzung.
Delphi-Quellcode:
Die eigentliche Übergabe ist:
procedure TChangeMemberstatus.Execute;
begin CreateDataModules; Synchronize(OutputMessage); FreeDataModules; end;
Delphi-Quellcode:
Hab erstmal damit kämpfen müssen das der Record daten enthällt im Thread. Jedesmal wenn die Function aufgerufen wurde, waren im Record keine Werte. Das ist jedoch behoben aber die Zugriffsverletzung bleibt. Mache ich da was falsch oder geht das einfach nicht auf die Art?
Core_Form.HandleThreadMessages(True, Msg);
|
Re: Thread in Anwendung verursacht EAVoilation
Zitat:
Schon mal versucht die Konfiguration mitzuübergeben? Schon mal im Debugger angesehen? |
Re: Thread in Anwendung verursacht EAVoilation
Das es immer True ergibt ist mir klar. Hat aber nichts mit dem eingetlichen Problem zu tun.
Konfiguration ist ja vorhanden habe ich auch getestet. Der Fehler selbst kommt von der AOChat Komponente. Zitat:
Delphi-Quellcode:
Wie man hier im Test sieht, sind da keine Variablen übergeben, sondern nur feste Werte an eine Komponente.
AOChat.SendGroup('Point of no Return', 'Test'); // da tritt der Fehler schon auf
|
Re: Thread in Anwendung verursacht EAVoilation
Wann wird AOChat intantiiert? Diese Komponente sollte eigentlich für jeden Thread eine Instanz haben.
|
Re: Thread in Anwendung verursacht EAVoilation
Bisher ist es so...
Ich habe die AOChat Komponente auf meiner Form. Im Create der Form wird die Konfiguration geladen und auch gleich das AOChat.Connect ausgefüht. Danach das AOChat.Login... Wie man ja aus dem namen erkennen kann, ist es eine Chat Komponente. Da das Chatsystem von AO nicht das dollste ist, reagiere ich mit Threads auf die Ereignisse der Komponente.
Delphi-Quellcode:
Bisher damit es lauffähig ist, habe ich die AOChat praktisch mit übergeben. Im Thread kann ich dann auf diese Zugreifen. Ich hätte halt gerne diese Komponente aus den Threads raus.
{ ---------------------------------------------------------------------------- }
{ - Thread zum registrieren der Memberstatus starten (Online / Offline) - } { ---------------------------------------------------------------------------- } procedure TCore_Form.AOChatFriendStatusChange(Sender: TObject; Friend: TFriendInfo); Var ChangeMemberstatus : TChangeMemberstatus; begin ChangeMemberstatus := TChangeMemberstatus.Create(True); ChangeMemberstatus.FreeOnTerminate := True; ChangeMemberstatus.Orgname := Organisation; ChangeMemberstatus.AOChat := AOChat; ChangeMemberstatus.Online := Friend.Online; ChangeMemberstatus.Charname := Friend.Name; ChangeMemberstatus.Resume; end; Also dachte ich mir in meiner Hauptform erstelle ich die schon angesprochene Function die dann die Daten direkt ausgibt. So das ich im Thread selber wirklich nur das wichtigste erledige.
Delphi-Quellcode:
Sobald ich aber die Daten an meine Core_Form übergebe kommt die Zugriffsverletzung.
AOChat.SendGroup(Orgname, OutputStr);
//Core_Form.HandleThreadMessages(True, Outputstr); Wenn ich dagegen im Thread die Komponente mit übergebe klappt es.
Delphi-Quellcode:
Ich berücksichtige hier nichtmal Variablen. Es wird einfach nur was Statisch ausgegeben aber das klappt einfach nicht. Geht das aus den Threads heraus nicht?
Function TCore_Form.HandleThreadMessages(IsCommand: Boolean; Msg: String): Boolean;
Begin Msg := FormatOutgoing(Msg); AOChat.SendGroup('Point of no Return', 'Test'); End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz