AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Thread in Anwendung verursacht EAVoilation
Thema durchsuchen
Ansicht
Themen-Optionen

Thread in Anwendung verursacht EAVoilation

Ein Thema von Cyberaxx · begonnen am 12. Nov 2006 · letzter Beitrag vom 13. Nov 2006
Antwort Antwort
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
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Thread in Anwendung verursacht EAVoilation

  Alt 12. Nov 2006, 22:49
Zitat:
(IsCommand OR Not IsCommand)
ergibt immer True.
Schon mal versucht die Konfiguration mitzuübergeben?
Schon mal im Debugger angesehen?
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

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

Re: Thread in Anwendung verursacht EAVoilation

  Alt 12. Nov 2006, 23:01
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:
---------------------------
Debugger Exception Notification
---------------------------
Project NextGen.exe raised exception class EAccessViolation with message 'Access violation at address 004C6DF0 in module 'NextGen.exe'. Read of address 000002F8'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
Das ist die genaue Fehlermeldung und ich muss zugeben ich habe keine Ahnung was die zu bedeuten hat.

AOChat.SendGroup('Point of no Return', 'Test'); // da tritt der Fehler schon auf Wie man hier im Test sieht, sind da keine Variablen übergeben, sondern nur feste Werte an eine Komponente.
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
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Thread in Anwendung verursacht EAVoilation

  Alt 13. Nov 2006, 07:34
Wann wird AOChat intantiiert? Diese Komponente sollte eigentlich für jeden Thread eine Instanz haben.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Cyberaxx
Cyberaxx

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

Re: Thread in Anwendung verursacht EAVoilation

  Alt 13. Nov 2006, 09:25
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:
{ ---------------------------------------------------------------------------- }
{ -   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;
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.
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:
  AOChat.SendGroup(Orgname, OutputStr);
  //Core_Form.HandleThreadMessages(True, Outputstr);
Sobald ich aber die Daten an meine Core_Form übergebe kommt die Zugriffsverletzung.
Wenn ich dagegen im Thread die Komponente mit übergebe klappt es.

Delphi-Quellcode:
Function TCore_Form.HandleThreadMessages(IsCommand: Boolean; Msg: String): Boolean;
Begin
Msg := FormatOutgoing(Msg);
AOChat.SendGroup('Point of no Return', 'Test');
End;
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?
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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz