Avatar billede k.qvist Nybegynder
10. februar 2004 - 16:11 Der er 12 kommentarer og
1 løsning

PostThreadMessage() til CWinApp

Jeg kan ikke få fat i de beskeder jeg sender fra en tråd, jeg sender dem med
m_hMainThread->PostThreadMessage( WM_POSTTOTHREAD, POSTTOQUEUE, reinterpret_cast< LPARAM >(pCMsg ) );
m_hMainThread er en CWinThread* til hovedtråden, WM_POTTOTHREAD er: const UINT WM_POSTTOTHREAD  = WM_USER + 0;
POSTTOQUEUE er: const UINT POSTTOQUEUE    = WM_APP  + 0;
Ovre i min CWinApp bruger jeg dette:
BEGIN_MESSAGE_MAP(CCANEmcyApp, CWinThread)
  ON_THREAD_MESSAGE( WM_POSTTOTHREAD, OnReciveCMSG )
END_MESSAGE_MAP()
Men der sker intet, det går fint med PostThreadMessage, men jeg modtager aldrig noget
Jeg bruger VC++ .Net
Avatar billede bertelbrander Novice
10. februar 2004 - 20:13 #1
Hvilken type applikation er CWinApp?

Der er et problem med at sende en message med PostThreadMessage() hvis applikationen kører i en modal loop dvs. en modal dialog, hvis den gør det bliver beskeden ignoreret.

Du kan installere en message hook til at fange beskeden. Det gør man med SetWindowsHookEx(...), med en WH_GETMESSAGE hook.

Jeg har vist et eksempel til at ligge, kan godt rode det frem hvis det har interresse.
Avatar billede k.qvist Nybegynder
10. februar 2004 - 22:01 #2
Det har det helt sikkert, CWinApp kører i en DLL, det er en static MFC Dll.
Avatar billede k.qvist Nybegynder
10. februar 2004 - 22:03 #3
Jeg kan først teste det imorgen tidlig, da jeg ikke har udviklingsmiljøet hjemme. Så jeg svarer ikke lige mere iaften
Avatar billede k.qvist Nybegynder
10. februar 2004 - 22:13 #4
Jeg har lige været inde på din hjemmeside bertelbrander, og set dine eksempler har også prøvet med peekmessage, men det er ikke helt det jeg skal bruge, det jeg godt kunne tænke mig var noget i stil med onCommand, WM_COMMAND og postmessage, men jeg har pt ikke noget vindue i dll'en
Avatar billede bertelbrander Novice
11. februar 2004 - 00:37 #5
Jeg har lavet et eksempel her:
http://home20.inet.tele.dk/midgaard/t4.zip

Eksemplet er lavet med VC++ 6.0, så der skal måske nogle små rettelser til for at få det til at køre på .net
Hvis det kører som det skal vil tælleren i "Val: xx" tælle op, en gang for hver sekund.

Jeg er ikke sikker på at jeg forstår hvordan man kan have en CWinApp til at køre i en DLL (en static MFC dll!) uden noget vindue, men der er nok heller ikke nødvendigt at jeg forstår...
Avatar billede k.qvist Nybegynder
11. februar 2004 - 10:19 #6
Jeg har prøvet at implementer det du sendte i dit eksempel, men det duer ikke, det jeg gjorde før var at jeg lavede min tråd med _beginthreadx, nu har jeg så også prøvet med AfxBeginThread, men der sker ikke en S..., når jeg debugger det, sender PostThreadMessage fint, returværdien er 1, når jeg slutter programmet kommer dette:
Detected memory leaks!
Dumping objects ->
{60} normal block at 0x01024B38, 16 bytes long.
Data: <                > 94 00 00 00 08 00 00 00 00 10 81 03 0C 01 80 00
{59} normal block at 0x01024AE8, 16 bytes long.
Data: <                > 94 00 00 00 08 00 00 00 00 00 81 03 0C 01 00 00
.
.
{51} normal block at 0x010229C8, 16 bytes long.
Data: <                > 94 00 00 00 08 00 00 00 00 00 81 03 0C 01 00 00
Object dump complete.
Men jeg kan ikke få fat idet?????
Avatar billede bertelbrander Novice
11. februar 2004 - 20:57 #7
"Detected memory leaks!" tyder på at nogen glemmer at delete/free() noget, og har måske/måske ikke noget med sagen at gøre.

Hvis du er sikker på at du får sendt beskeden korrect må der være en fejl på modtager siden. Hvad er det du forsøger at sende til? Hvad laver den tråd der skulle modtage?
Avatar billede k.qvist Nybegynder
11. februar 2004 - 21:29 #8
Jeg er klar over jeg ikke får ryddet op, det der er vist ovenfor er de data jeg sender fra min tråd, men som jeg ikke kan få fat på i min CWinApp tråd.
Den tråd der skulle modtage laver ikke noget, det er som sagt en DLL hvor der er mulig hed for at lave tre kald ned i, som det er nu. Et der stater tråden, et der stopper den og et kald der retunerer de data der bliver sendt fra tråden.
Avatar billede bertelbrander Novice
11. februar 2004 - 22:42 #9
Lige for at forstå det rigtigt, er den tråd du sender til CWinApp-tråden eller en anden tråd?

En tråd kan ikke lave "ikke noget", den må vente i en eller anden form for løkke, hvis den skal kunne modtage beskeder fra andre tråde og/eller fra windows skal den køre i en eller anden form for message loop.

En CWinApp tråd har normalt en message-loop der er skjult for brugeren, men andre tråde må man selv kode en loop for.
Avatar billede k.qvist Nybegynder
12. februar 2004 - 08:32 #10
Det er til CWinApp tråden jeg sender.

Jeg kigger lige lidt på det med CWinApp's message-loop, kan man evt lave et "usynligt" vindue så man holder liv i tråden?
Avatar billede k.qvist Nybegynder
12. februar 2004 - 11:24 #11
Problemet er løst nu, det var CWinApp der ikke initialisede message loopen ordenligt, så ved at overskrive CWinApp's Run() lykkedes det:

int CCANEmcyApp::Run()
{
  MSG msg;
  while (GetMessage(&msg, NULL, 0, 0))
  {
    if ( msg.message == WM_POSTTOTHREAD )
    {   
      OnReciveCMSG( msg.wParam, msg.lParam );
    }
    DispatchMessage(&msg);
  }
  return 0;
}

Hvis du poster et svar skal jeg nok acceptere det, tak for hjælpen
Avatar billede bertelbrander Novice
12. februar 2004 - 22:51 #12
Jeg forsøger at undgå point.
Avatar billede k.qvist Nybegynder
13. februar 2004 - 12:41 #13
Det er helt iorden så skal du have tak for hjælpen
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