Einzelnen Beitrag anzeigen

Benutzerbild von Cyberaxx
Cyberaxx

Registriert seit: 15. Jul 2005
311 Beiträge
 
Delphi XE5 Professional
 
#1

Thread in Anwendung verursacht EAVoilation

  Alt 12. Nov 2006, 21:26
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:
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;
Die Configuration ist in einem Record hinterlegt.

Delphi-Quellcode:
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;
Er ist in einer Unit auf die alle Zugriff haben. Geladen wird die Konfiguration dann
Constant.GetConfiguration(Config); Function GetConfiguration(Var LConfig: TConfig): Boolean; So schauts in der Constant.pas aus.

Jedesmal wenn ich aus dem Thread die Function aufrufe kommt es zu einer Zugriffsverletzung.
Delphi-Quellcode:
procedure TChangeMemberstatus.Execute;
begin
  CreateDataModules;

  Synchronize(OutputMessage);

  FreeDataModules;
end;
Die eigentliche Übergabe ist:
Core_Form.HandleThreadMessages(True, Msg); 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?
Daniel
Das Aufwachen aus einem boesen Traum muss einen nicht erleichtern. Es kann einen auch erst richtig gewahr werden lassen, was man Furchtbares getraeumt hat, vielleicht sogar welcher furchtbaren Wahrheit man im Traum begegnet ist!
  Mit Zitat antworten Zitat