Jason
LVF-Grünschnabel
Beiträge: 18
Registriert seit: Mar 2007
8.2.1, 8.5
-
kA
Deutschland
|
DLL mit Threads
Hi alle miteinander!
Stehe momentan an ein Problem.
Ich versuche schon seit paar wochen eine DLL zuschreiben mit 2 Threads.
Ich habe mir schon eine Applikation geschrieben die funktioniert, allerdings hat es einfach nicht geklappt das in einer DLL zu giessen.
Ich erzeuge zwei Threads eine zum Lesen aus einer Pipe und ein zum schreiben.
Der Lese-Thread befindet sich in eine Endlos-Schleife, da jederzeit irgendwas in der Pipe drinne stehen kann.
Der Schreibe Thread wird mit Events schlafen gelegt und bei einen neuen Befehl wieder ausgeweckt (Endlos-Schleife).
Nun habe ich das Problem das ich unter LabVIEW kein neuen Befehl senden kann, da es sich aufhängt.
Es funktioniert nur einmal am Anfang.
Ich hoffe mir kann einer helfen. Vielleicht hat jemand ein einfaches Beispiel das unter LabVIEW 8.2 läuft.
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>
_declspec(dllexport) void Communicator::Pipe_Comm(CString lpDLLName, CString lpMessageIn, CString *lpMessageOut)
{
threadinfo.m_Input = lpMessageIn;
threadinfo.m_Output = lpMessageOut;
if (ThreadFlag == FALSE)
{
/*Laden einer DLL und Zugriff auf die Funktion*/
if (!::CreatePipe(&hOutputRead, &hOutputWrite, NULL, 0))
{
MessageBox (NULL, "READ: Es ist eine Fehler beim Erstellen der Pipe aufgetreten!", "Fehler", MB_ICONERROR | MB_OK);
FreeLibrary(hModDLL);
}
hEvent_0 = CreateEvent(NULL, FALSE, FALSE, "Event_Thread0");
hEvent_1 = (NULL, FALSE, TRUE, "Event_Thread1");
hEvInput = CreateEvent(NULL, TRUE, FALSE, "Event_Input");
hEvReturn = CreateEvent(NULL, FALSE, FALSE, "Event_Return");
if (DisablePipe != TRUE)
{
unsigned threadId;
Thread1[0] = (HANDLE)_beginthreadex(NULL,
0,
PipeThread1,
reinterpret_cast<void*>(this), // PipeThread argument
0,//CREATE_SUSPENDED, &threadId);
Thread1[1] = (HANDLE)_beginthreadex(NULL,
0,
PipeThread2,
reinterpret_cast<void*>(this), // PipeThread argument
0, //CREATE_SUSPENDED, &threadId);
ThreadFlag = TRUE;
}
else if(ThreadFlag == TRUE)
{
SetEvent(hEvent_1);
}
//WaitForMultipleObjects(2,Thread1,0, );
WaitForSingleObject(hEvReturn,INFINITE);
//Sleep(3000);
}
else if(DisablePipe == TRUE)
{
MessageBox(NULL, "Kommunikation nicht möglich!nLaden der DLL erforderlich.", "Fehler", MB_ICONERROR | MB_OK);
}
//return ;
}
unsigned __stdcall Communicator::PipeThread2(LPVOID lpThreadParameter)
{
//Schreibe-thread
Communicator *thread_info = (Communicator*)lpThreadParameter;
HANDLE Thread2 = thread_info->Thread1[0];
HANDLE hEvent0 = thread_info->hEvent_0;
HANDLE hEvent1 = thread_info->hEvent_1;
HANDLE hEv_Input = thread_info->hEvInput;
HANDLE hEv_Return = thread_info->hEvReturn;
DWORD dwResult;
char* cmd;
long id;
CString compare = ""; //New insert
//MessageBox(NULL, "Ausgabe-Thread wird gestartet .....", "Ausgabe-Thread", MB_OK);
while(1)
{
//HANDLE hEvent0 = thread_info->hEvent_0;
// HANDLE hEvent1 = thread_info->hEvent_1;
dwResult = WaitForSingleObject(hEvent1 , INFINITE);
if (dwResult == WAIT_OBJECT_0)
{
// MessageBox(NULL, "Schreibe in Pipe", "Schreibe", MB_OK);
MessageBox(NULL, thread_info->threadinfo.m_Input, "InputData", MB_OK);
id = strtol(thread_info->threadinfo.m_Input, &cmd, 10);
if (compare != thread_info->threadinfo.m_Input)
{
/*Hier wird der Befehl gesendet*/
}
else { SetEvent(hEv_Return);}
}
Sleep(10);
//SetEvent(hEvent0);
}
delete thread_info;
return 0;
}
unsigned __stdcall Communicator::PipeThread1(LPVOID lpThreadParameter)
{
//Lese-Thread
Communicator *thread_info = (Communicator*)lpThreadParameter;
HANDLE Thread3 = thread_info->Thread1[1];
//HANDLE hEvent0 = thread_info->hEvent_0;
HANDLE hEvent1 = thread_info->hEvent_1;
HANDLE hEvIn[2];
hEvIn[0] = thread_info->hEvent_0;
hEvIn[1] = thread_info->hEvInput;
HANDLE m_readpipe = thread_info->hOutputRead;
HANDLE hEv_Return = thread_info->hEvReturn;
DWORD dwResult;
unsigned long n;
char buf[1024];
DWORD dwAvail;
CString Text;
MessageBox(NULL, "Lese-Thread wird gestartet .....", "Lese-Thread", MB_OK);
while(1)
{
//HANDLE hEvent0 = thread_info->hEvent_0;
//dwResult = WaitForSingleObject(hEvent0 , INFINITE);
dwResult = WAIT_OBJECT_0;//WaitForMultipleObjects(2,hEvIn,0, INFINITE);
if (dwResult == WAIT_OBJECT_0)
{
//MessageBox(NULL, "Lese aus Pipe", "Lesen", MB_OK);
dwAvail = 0;
while(1)
{
if (!::PeekNamedPipe(m_readpipe, NULL, 0, NULL, &dwAvail, NULL)) // error, the child process might ended
break;
if (!dwAvail)
{
// no data available, return
Sleep (10);
//SetEvent(hEvent1);
//ResetEvent(hEvIn[1]);
break;
}
::ReadFile(m_readpipe, buf,sizeof(buf), &n, NULL);
if (n > 0)
{
buf[n] = '';
Text = buf;
Text.Replace("n","rn");
//*thread_info->threadinfo.m_Output = Text;
MessageBox(NULL, Text, "Lesen", MB_OK);
SetEvent(hEv_Return);
}
SetEvent(hEvent1);
ResetEvent(hEvIn[1]);
Sleep(10);
}
}
else if (dwResult == WAIT_TIMEOUT)
{
break;
}
}
delete thread_info;
return 0;
}
</div>
|