Trädvy Permalänk
Medlem
Registrerad
Jan 2007

Visual C++, Event

Hej har ganska nyligen startat med c++ och har börjat på en irc client.
Jag har nu kommit till delen där jag ska lyssna av medelanden från server.
Jag har en klass som sköter connect, disconnect, ping etc.
I den klassen har jag en metod som skall lyssna efter medelandena,
metoden skapas används i en tråd eller från en tråd (hur man säger) som körs i bakgrunden. Metoden ska raise event när det finns medelanden.
eventet ska sedan användas i ett vanligt windows form program (addas i en listbox).

class irc
{
connect ();
disconnect();
listener (skapas från tråden)
}

class Form bla bla
{

print() //event metod som skall skriva medelande i listbox
}

kan någon hjälpa mig förklara hur detta funkar alternativt lite kod?

tack på förhand.

Trädvy Permalänk
Medlem
Registrerad
Jun 2006

Hej!
kolla här: http://msdn.microsoft.com/en-us/library/4b612y2s(VS.80).aspx
Jag har löst det i min IRC-klient med hjälp utav arv, ungefär så här:

Citat:

class irc
{
connect ();
disconnect();
listener (skapas från tråden) //anropar handleMessage vid meddelanden
handleMessage(std::string message); //anropar onMessage, onVoice etc.
onMessage(std::string message)=0;
onVoice()=0;
}

class Form bla bla : irc //ärver från irc klassen
{

onMessage(std::string message); //här kan du nu anropa print()
print() //event metod som skall skriva medelande i listbox
}

citera!

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av Dosshell
kolla här: http://msdn.microsoft.com/en-us/library/4b612y2s(VS.80).aspx

Vad kör du egentligen? .net? mfc? Det där gäller .net, men samtidigt använder du std-strängar och liknande.

Citat:

Ursprungligen inskrivet av Dosshell
Jag har löst det i min IRC-klient med hjälp utav arv, ungefär så här:

Det där är dock mera vanliga funktionsanrop än händelser.

Trädvy Permalänk
Medlem
Registrerad
Jun 2006

Whopps, självklart skall det inte vara std strängar.
Min kod är skriver i C# .NET 3.5 (varav dålig översättning mitt i natten).
Det är mycket riktigt att det är mer funktionsanrop än händelser. Det var inte menat som kod för events utan mer som visa ett annat sätt att gå till väga. För att lösa det med events se länken ovan.

citera!

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av Dosshell
C#

C++ var det väl ändå?

Trädvy Permalänk
Medlem
Registrerad
Jan 2007

Jag har också programmerat en irc client (dock ej komplett men med fungerande "listener" i C#) den listener använder sig inte av event, men eftersom jag bytat programmeringsspråk tänkte jag göra om irc clienten på ett annat vis.

Tyckte det kändes bra att prova på det där med events.
Kom gärna med förslag om hur det kan lösas på ett väldigt enkelt sätt om möjligt.

Trädvy Permalänk
Medlem
Registrerad
Jun 2006

Tycker det låter smart att använda events. Här är ett exempel:

using namespace System;

delegate void OnMessageEventHandler(String^);

class IRC
{
event OnMessageEventHandler^ onMessage;
connect ();
disconnect();
listener() {
onMessage("meddelande"); //utlöser event function
}
};

class blabla
{
void print(String^);
};

main()
{
blabla^ minblabla = gcnew blabla();
IRC^ minIRC = gcnew IRC();
minIRC->onMessage += gcnew OnMessageEventHandler(minblabla, &blabla::print);

//Väck upp event
minIRC->listener();
}

Citat:

C++ var det väl ändå?

Du frågade vad jag kör, och jag använder C# till min irc-klient. Jag översatte grovt min c# kod till vc++.

citera!

Trädvy Permalänk
Medlem
Registrerad
Jan 2007

Tack för svaret, skall prova det när jag kommer hem.

Trädvy Permalänk
Hedersmedlem
Plats
Linköping
Registrerad
Apr 2004
Citat:

Ursprungligen inskrivet av Dosshell
Du frågade vad jag kör, och jag använder C# till min irc-klient. Jag översatte grovt min c# kod till vc++.

Ah, förlåt. Jag utgick från att du var originalpostaren och att du hade löst problemet på egen hand.

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Nov 2001
Citat:

Ursprungligen inskrivet av Dosshell

Du frågade vad jag kör, och jag använder C# till min irc-klient. Jag översatte grovt min c# kod till vc++.

Det där är C++CLI, alltså en variant av Managed C++ som körs med access till .NET-biblioteket, och INTE något man ska blanda ihop med C++ (namnet till trots) då det körs under helt andra förutsättningar. Det är dock lite oklart vilket språk OP egentligen skriver i.

Det vanligaste sättet att lösa det på i C++ är att ha någon form av producer/consumer där en lista byggs på från ena sidan och plockas av från andra sidan. Elementen i listan är alltså de "meddelanden" du vill skicka. Listan i sig måste wrappas i en CriticalSection (har för mig windows-namnet på det är så) så att den inte modifieras av flera trådar samtidigt (om det nu är det du gör).

Sedan finns det ju oändligt många andra sätt att göra det, win32 har säkert nått inbyggt meddelande-system som man också kan använda.

void@qnet
teeworlds, stålverk80, evil schemer, c, c++
Languages shape the way we think, or don't.