PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : klassenübegreifend & QThread



wodda
21-05-2003, 21:28
hi!

es geht nachwievor um eine simple client server anwendung, die voerst dazu dienen soll den inhalt eines MultiLine Objectes zu übertragen. dabei stehe ich wiedermal an.

in meinem Programm habe ich 2 Klassen (eigentlich mehr mit den Klassen des .ui)



class Chatmini : public FormMain

sieht alle elemente der FormMain (buttons, MultiLine usw)


class Mysocket : public Chatmini
ist von Chatmini veerbt.

Ich habe mir dass jetzt so überlegt:
in Mysocket wird ein neuer Thread mittel QThread gestartet und der Socket verwaltet.



void Chatmini::b_connect(){
Mysocket *sock = new Mysocket();
if (RadioServer->isChecked()) {
sock->createServer();
} else {
sock->createClient();
}
}
dies wird richtig ausgeführt und zb. createServer aus der Klasse Mysocket aufgerufen. Von dieser aus kann ich aber keine Elemente mehr der FormMain ansprechen. bzw. ansprechen schon, jedoch ohne auswirkung.
mittels qWarning weiß ich dass er die funktion wirklich aufruft.

hat jemand ein bsp für ein ähnliches programm? oder erkennt mein problem?

danke!
mfg wodda

anda_skoa
21-05-2003, 22:46
Was ist MySocket?

Für QSockets brauchts du keine Threads, die arbeiten über Events.

Falls du da also intern QSocket statt QSocketDevice in Zusammenhang mit Threads benutzt, hast du möglicherweise die Eventloop gelockt.

Für kleinere Sachen, spezielle für den Client, würde ich auf QSocket raten und Threads mal beseite lassen.

Ciao,
_

wodda
22-05-2003, 21:16
hi!

danke für den hinweis. da war ich wieder mal zu hastig.
weiß jedoch an einem punkt nicht mehr weiter...

wie schon gesagt, setzt sich mein programm aus folgenden Klassen zusammen:

MainForm // erstellter Dialog vom designer
Chatmini // hauptform
SimpleServer // erstellt einen einfachen server mittel Qserversocket und Qsocket

ich habe es geschafft, dass der server läuft, und das gui dabei nicht stehen bleibt.
jedoch würde ich gern die informationen die der server (vorerst vom telnet) erhaltet gerne sichtbar machen zb. multiline element.

Jedoch weiß ich nicht wie ich drauf zugreiffen kann. Habe es mit "friend class" probiert und mit MainForm form = new MainForm();
form->MultiLineDebug->insertLine("Disconnect client....");
wobei der Compiler dies schluckt. Aber ich das Ergebniss nicht sehe.

hat jemand einen Rat?

thx,
wodda

anda_skoa
22-05-2003, 21:33
Hmm, so allgemein kann ich da nix sagen, ich bräuchte bischen mehr Code :)

Vielleicht kannst du ein kleines tgz erstellen und an ein Posting anhängen?

Ciao,
_

wodda
22-05-2003, 21:56
hier :-)

thx!

wodda
23-05-2003, 21:51
hi!

habe es geschafft einen client mit einem server eine verbindung zu erstellen lassen, wobei beides so weit eingebaut ist.
Server + Client haben jeweils eigenen klassen.
Mein Problem ist jetzt natürlich, wie ich aus zb. der Clientklasse auf die wesentlichen GUI elemente wie die MultiLine Elemente zugreifen kann. (auslesen, und neuen inhalt hineinschreiben)

und auch wie ich zb. mit dem senden button die senden funktion der clientklasse richtig aufrufe?

ich habs neue einmal angehängt, und wäre über jede hilfe extrem dankbar.
Das problem ist, dass es am besten schon montag in der früh zum ein "bisschen" vorführen reichen sollte :(

thx,
wodda

anda_skoa
24-05-2003, 13:24
Original geschrieben von wodda
Mein Problem ist jetzt natürlich, wie ich aus zb. der Clientklasse auf die wesentlichen GUI elemente wie die MultiLine Elemente zugreifen kann. (auslesen, und neuen inhalt hineinschreiben)


Das ist meiner Meinung nach die falsche Richtung.
Besser du schaffst eine Möglichkeit, wie die GUI Klasse auf den Socket zugreifen kann.

Wenn du als Client operierst, dann hast du eh den Client Socket direkt durch das anlegen.
Wenn du als Server operierst, mach den neuen Socket doch einfach über ein Signal bekannt. Du kannst den Pointer auf den Socket als Parameter in deinem newConnect Signal transportieren.



und auch wie ich zb. mit dem senden button die senden funktion der clientklasse richtig aufrufe?


Nun, falls die Senden Funktion ein parameterloser Slot ist, brauchst du nur das Signal clicked() des Buttons mit dem Slot verbinden.

Ciao,
_

wodda
25-05-2003, 18:16
hi!

danke für die tipps, könntest du vielleicht ein kurzes bsp für einen ansatz posten?

thx,
wodda

anda_skoa
25-05-2003, 18:18
Original geschrieben von wodda
hi!

danke für die tipps, könntest du vielleicht ein kurzes bsp für einen ansatz posten?


schon passiert :D
http://www.mrunix.de/forums/showthread.php?s=&threadid=32097

Ciao,
_

wodda
25-05-2003, 18:36
wahnsinn!

danke :-)