Avatar billede cplus Nybegynder
23. oktober 2003 - 13:41 Der er 17 kommentarer og
1 løsning

CWinThread kalder GetDocument()

Jeg har en CWinThread tråd, som skal processere noget via en metode i min dokument klasse.

Jeg vil så gerne i min CWinThread kalde denne funktion.

Jeg gør således:
1. Får en pointer til mit doc via CMainFrame::GetActiveDocument.

CMainFrame er initialiseret korrekt! Jeg kan sagtens sende beskeder via PostMessage

2. Jeg kalder en funktion.  m_pDoc->myFunction()

Hvad går galt? Jeg får et seriøst problem idet jeg forsøger at modtage en pointer.
Avatar billede jpk Nybegynder
23. oktober 2003 - 13:44 #1
Nu er "Jeg får et seriøst problem" jo ikke lige en nem beskrivelse at gå ud fra...
Hvad sker der helt præcist?
Avatar billede cplus Nybegynder
23. oktober 2003 - 13:46 #2
Meget simplet mit program brager ned. Når jeg gør sådan her:

//Når jeg vil eksekvere hér brager programmet end.. også uden assertions.
m_pDoc = m_pFrame->GetActiveDocument();
Avatar billede jpk Nybegynder
23. oktober 2003 - 13:48 #3
Hvordan er m_pFrame initialiseret?
Avatar billede cplus Nybegynder
23. oktober 2003 - 13:51 #4
m_pFrame = (CMainFrame*)AfxGetMainWnd();
Avatar billede jpk Nybegynder
23. oktober 2003 - 13:57 #5
Og den er helt sikkert gyldig?
Altså, det giver samme resultat med:
m_pDoc = ((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();

Hvilken klasse arver din CMainFrame fra?
Avatar billede cplus Nybegynder
23. oktober 2003 - 13:58 #6
CFrameWnd
Avatar billede cplus Nybegynder
23. oktober 2003 - 14:00 #7
AfxGetMainWnd -retunerer vel ikke et DOC? AfxGetMainWnd giver heller ikke indirekte adgang til CFrameWnd?
Avatar billede cplus Nybegynder
23. oktober 2003 - 14:04 #8
Problemet ved jeg ikke lige hvor opstår.. Problemet kan ikke være at det er fra en anden CWinThread ?
Avatar billede jpk Nybegynder
23. oktober 2003 - 14:05 #9
Nej, AfxGetMainWnd returnerer ikke en CDocument pointer.
Hvad mener du med indirekte?

Men hvad har alt det med ovenstående at gøre..?
Avatar billede jpk Nybegynder
23. oktober 2003 - 14:08 #10
Disse 2 linier:

CMainFrame* pFrame = (CMainFrame*)AfxGetMainWnd();
CDocument* pDoc = pFrame->GetActiveDocument();

Kan jo også skrives som:

CDocument* pDoc = ((CMainFrame*)AfxGetMainWnd())->GetActiveDocument();
Avatar billede cplus Nybegynder
23. oktober 2003 - 14:12 #11
Ok ok...

Se jeg placerede min initialisering af m_pDoc, som er et gyldigt medlem i min tråd klasse -et andet sted -i min mainframe klasse.

Så på en eller anden måde virkered det hvis jeg sagde..

m_pApp->m_myThread->m_pDoc = pDoc; //Dette virkede fint.

Har det måske noget at gøre med at initialiserigen er placeret et forkert sted?
Avatar billede jpk Nybegynder
23. oktober 2003 - 14:19 #12
Hmm, er ikke med...

Virker det eller virker det ikke?
Hvad er det du vil opnå og hvordan?
Avatar billede cplus Nybegynder
23. oktober 2003 - 14:22 #13
Jeg skal bare ha' en pointer til mit aktive dokument i min tråd klasse. Jeg har fundet ud af det -men du får point alligevel for sparringen :)

Initialiseringen af trådens doc medlem sker umiddelbart til sidst i InitInstance. Så virker det fint -og alle tråde er startet op.
Avatar billede jpk Nybegynder
23. oktober 2003 - 14:26 #14
Initialiserer du m_pDoc i din main thread?
Avatar billede jpk Nybegynder
23. oktober 2003 - 14:28 #15
I så fald vil den jo være ugyldig hvis du skifter active doc
Avatar billede cplus Nybegynder
23. oktober 2003 - 14:58 #16
Rigtigt.. men det gør den så ikke. Kører altid med samme dokument
Avatar billede cplus Nybegynder
28. november 2003 - 10:12 #17
jpk svar lige -så får du point..

Forresten kan jeg fortælle dig at jeg sendte en pointer med en WM besked og låste via en semaphore count
Avatar billede jpk Nybegynder
28. november 2003 - 10:32 #18
Tak skal du ha'...
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