S
Guten Morgen hustbear,
vielen Dank. Ja ich habe auch Lock und Unlock ursprünglich als void deklariert , um herauszufinden warum es aber nich funktioniert habe ich das zurück gegeben. Später wollte ich noch TryLock machen.. welcher mit dann ein false zurück geben kann fall schon gelockt wurde ,
Genau das "reentrant" Thema is mir dann eingefallen, und ich dachte "AHAAA".. Aber dem war dann nicht so, ich hatte das erste Lock im UI Thread gemacht, und das zweite in einem neu erzeugten Thread. Und Lock blockierte trotzdem nicht:(
Hier der Code Auschnitt, in dem ich das teste :
(Meine Thread Tick munter weiter, obwohl das eigentlich nicht dürfte, da ich davor im UI Thread schon locke)
UINT CDialogMfcAppDlg::MFCThreadProc(LPVOID lpParameter)
{
while(WaitForSingleObject(_timerHandle,1000) == WAIT_TIMEOUT)
{
HWND dlg = GetSafeHwnd();
::PostMessage(dlg, WM_ON_ADD_ITEM, 0, 0);
}
return 0;
}
static UINT MFCThreadProc1(LPVOID lpParameter)
{
CDialogMfcAppDlg* pt = (CDialogMfcAppDlg*)lpParameter;
return pt->MFCThreadProc(NULL);
}
LRESULT CDialogMfcAppDlg::OnThreadMessage(WPARAM wParam, LPARAM lParam)
{
UNREFERENCED_PARAMETER(lParam);
UNREFERENCED_PARAMETER(wParam);
_mutex.Lock(); /* Lcok new Thread */
_outputList->AddString(_T("Tick"));
_mutex.Unlock();
return 0;
}
BOOL CDialogMfcAppDlg::OnInitDialog()
{
CDialog::OnInitDialog();
_outputList = static_cast<CListBox*>(this->GetDlgItem(IDC_LIST1));
_outputList->AddString(_T("First Lock"));
_mutex.Lock(); /* lock UI THREAD */
AfxBeginThread(MFCThreadProc1,this);
}
EDIT: @hustbaer , ich ziehe wieder mal den HUT vor dir;) MIST .. ich locke ja wieder im UI Thread, nicht im zweiten Thread.. wenn ich Lock in "MFCThreadProc" dann tut er das was ich will;) Danke für den Denkanstoß frohe Ostern;)