Knowledge Base Nr: 00155 dllthread.cpp - http://www.swe-kaiser.de
Downloads:
Win32: Template f�r eine DLL die mittels einem Thread Daten sammelt.
Der Zugriff auf die Daten ist �ber eine Critical Section verriegelt.
(Wird die DLL von mehreren Prozessen benutzt w�re ein Mutex evtl. sinnvoller.)
int g_nErr = 0;
char g_szError[MAX_DATA] = {0};
CRITICAL_SECTION g_cs;
void GetData3964() //3964
{
...
::EnterCriticalSection(&g_cs);
g_nErr = 1;
sprintf(g_szError, "ERROR: COM%d nicht verf�gbar!", g_nPortNo+1);
::LeaveCriticalSection(&g_cs);
...
}
DWORD WINAPI GetData3964Thread(LPVOID lpParameter)
{
while (1)
{
GetData3964();
Sleep(1000);
}
}
//////////////
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
HANDLE hnd;
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
::InitializeCriticalSection(&g_cs);
hnd = CreateThread(
0, // pointer to security attributes
0, // initial thread stack size
GetData3964Thread, // pointer to thread function
0, // argument for new thread
0, // creation flags
0 // pointer to receive thread ID
);
if (!hnd)
::MessageBox(NULL, "Kommunikations-Thread kann nicht erzeugt werden!", "Kritischer Fehler", MB_ICONERROR|MB_OK);
break;
case DLL_PROCESS_DETACH:
::DeleteCriticalSection(&g_cs);
break;
}
return TRUE;
}
//////////////
FAWDLL_API int PASCAL GetError()
{
int nError = 0;
::EnterCriticalSection(&g_cs);
nValue = g_nErr;
::LeaveCriticalSection(&g_cs);
if (nError > 0)
MessageBox(NULL, "Function GetFunctionError(): irgendein Fehler!", "Kritischer Fehler!", MB_ICONERROR|MB_OK);
return nError;
}
FAWDLL_API void PASCAL GetErrorString(char* szValueError)
{
::EnterCriticalSection(&g_cs);
strcpy(szValueError, g_szError);
::LeaveCriticalSection(&g_cs);
}