Avatar billede jonashn Nybegynder
30. januar 2008 - 17:52 Der er 7 kommentarer og
1 løsning

Lave tråd som kan pille ved member variabler

Hej!

Jeg er i gang med et chatprogram som er skrevet i _Visual_ C++ som bruger et Instant Messaging bibliotek skrevet i ren C++.

Når jeg har connected til den host jeg vil chatte med skal jeg køre en medlemsfunktion i instansen af IM-librariet. Den skal køres i en uendelig loop, og jeg lagde i min uvidenhed først loopen ind i en GUI-funktion, men efter lidt research har jeg fundet ud af at programmet bare stopper med at svare p.g.a. af løkken stopper kørslen af hovedloopen.

Jeg har derfor fundet ud af at jeg skal lave en tråd til, som handler denne loop.

Jeg kan bare ikke finde ud af den rigtige syntax til CreateProcess, så dens "body" er en member funktion af min Visual C++ GUI form klasse.

Det svære er bare at kode det på den rigtige måde. Lige nu har jeg:
            DWORD  threadId;
            HANDLE hThread;
            hThread = CreateThread( NULL, 0, &WaldorfChat::Form1::ListenForRecvs, NULL, 0, &threadId );

som giver en warning og en error:

warning C4441: calling convention of '__stdcall ' ignored; '__clrcall ' used instead   

error C3374: can't take address of 'WaldorfChat::Form1::ListenForRecvs' unless creating delegate instance

Håber på at i forstår mit spm:) Det er lidt svært at beskrive, så bare spørg hvis der er noget der er uklart.

Håber at i kan hjælpe!

Jonas
Avatar billede jonashn Nybegynder
30. januar 2008 - 17:59 #1
-og tråden bliver self. created fra GUI handling funktionen.
Avatar billede mbulow Nybegynder
01. februar 2008 - 09:26 #2
// Det er det her du ønsker at opnå:
// ---------------------------------

class MyClass
{
  public:
      void Loop(void);
};

MyClass mc;
DWORD threadId;
HANDLE hThread;
CreateThread(NULL, 0, &ms::loop, NULL, 0, &threadId);



// Opret en ThreadProc-funktion
// Send objektets adresse som parameter (via CreateThread)
// Lad ThreadProc kalde funktionen
class MyClass
{
  public:
      void Loop(void);
};

DWORD WINAPI ThreadProc(LPVOID lpParam)
{
  ((MyClass*)lpParam)->Loop();

  return 0;
}

MyClass mc;
DWORD threadId;
HANDLE hThread;
CreateThread(NULL, 0, ThreadProc, (LPVOID)&mc, 0, &threadId);



Er på arbejde. Så har ikke tid til at forklare nærmere lige nu. Har du brug for mere hjælp må jeg se om jeg kan kigge nærmere på det senere.
Avatar billede jonashn Nybegynder
01. februar 2008 - 15:35 #3
Tak for svaret. Jeg kan se at det var det jeg bad om, men jeg har nu fundet ud af at Windows Forms Controls __ikke__ er trådsikre, så deres metoder kan kaldes fra den tråd der lavede dem.
Avatar billede arne_v Ekspert
03. februar 2008 - 05:41 #4
Hvis du bruger .NET Win forms, så bør du nok også bruge .NET Threading fremfor Win32
threading.

Du skal bruge delegates og invoke for at lave win forms med tråde.
Avatar billede arne_v Ekspert
03. februar 2008 - 05:42 #5
Og GUI i C# der bruger lib i C++ vil nok være nemmere - ikke så meget p.g.a. sproget
men du finder 10000 gange så mange eksempler til win forms i C# som i C++ !
Avatar billede jonashn Nybegynder
26. januar 2011 - 09:49 #6
Well.. Så er jeg så kommet tilbage til eksperten efter en del tids pause - mailbotten har åbenbart ikke virket, men jeg vil gerne have lukket de spm. jeg ikke har fået lukket endnu, så smid et svar!
Avatar billede jonashn Nybegynder
26. januar 2011 - 09:54 #7
Smid et svar!
Avatar billede arne_v Ekspert
26. januar 2011 - 20:00 #8
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester