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?