Jag undrar om detta går att göra i VC++. Är inte lpParameter en in-parameter eller kan jag skicka med en >Är inte lpParameter en in-parameter Jag får inte till det.Kommunikation med tråd
Ifrån ett program skall man starta en tråd.
Inne i tråden skall man skapa ett objekt med ett antal metoder och
properties.
Dessa metoder och properties vill man komma åt ifrån
huvudprogrammet som skall spegla samma interface som
objektet som körs i tråden.
Jag kan förklara mer om det behövs men i princip handlar det om
hur man kommunicerar mellan huvudprogram och tråd.Sv: Kommunikation med tråd
Först och främst måste du väl se till att huvudtråden får tillgång till objektet. Det kan du göra genom att lagra en pekare till det i någon delad variabel eller skicka tillbaka den via CreateThreads lpParameter eller motsvarande. Sedan är det väl bara att använda objektet från huvudtråden. Se bara till att synkronisera ordentligt så att all delad data läses och skrivs på ett trådsäkert sätt.
MSSv: Kommunikation med tråd
objektvariabel där som tråder använder för att skapa objektet?Sv: Kommunikation med tråd
Jo, men den kan ju peka till en pekare som tråden sen sätter att peka på det nya objektet.
>eller kan jag skicka med en objektvariabel där som tråder använder för att skapa objektet?
Ja det kan du också göra.
MSSv: Kommunikation med tråd
Vad gör jag för fel?
COM-objektet som instancieras i tråden skapas inte.
Har en ATL-komponent där jag har denna h-fil:
class ATL_NO_VTABLE CMyClass :
public IMyClass
{
public:
CMyClass()
: intTal(0)
{
CoInitialize(NULL);
HANDLE hThread;
DWORD threadID;
hThread = CreateThread(NULL, 0, ThreadProc, (LPVOID) &ptr,
0, &threadID);
// Att skapa objektet direkt fungerar
// ptr.CreateInstance(__uuidof(CVBNum));
}
DECLARE_PROTECT_FINAL_CONSTRUCT()
HRESULT FinalConstruct()
{
return S_OK;
}
void FinalRelease()
{
CoUninitialize();
}
private:
int intTal;
_CVBNumPtr ptr;
public:
STDMETHOD(get_pMyTal)(SHORT* pVal);
};
Och bland annat detta i en cpp-fil:
STDMETHODIMP CMyClass::get_pMyTal(SHORT* pVal)
{
if (ptr != NULL)
*pVal = ptr->MyVBNumber();
else
*pVal = -1;
return S_OK;
}
DWORD WINAPI ThreadProc(void* tparam)
{
_CVBNumPtr *ptr = (_CVBNumPtr*) tparam;
ptr->CreateInstance(__uuidof(CVBNum));
MSG msg;
while (GetMessage(&msg, 0, 0, 0))
DispatchMessage(&msg);
return msg.wParam;
}