Форум программистов, компьютерный форум CyberForum.ru

Работа с мьютексами - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Шаблоны. Что я не так делаю? http://www.cyberforum.ru/cpp-beginners/thread602800.html
#ifndef _TSTACK_H_ #define _TSTACK_H_ //================================================================================================= template <class TBase> class TStack { //------------------------------------------------------------------------------------------------- private: //------------------------------------------------------------------------------------------------- ...
C++ Открытая графическая библиотека Всем привет, есть ли графическая библиотека с открытым исходным кодом?если есть то можно ссылку. http://www.cyberforum.ru/cpp-beginners/thread602793.html
C++ С++ Метод прямоугольников
Помогите пожалуйсто с задачкой. Метод вроде понятен, но составить прграмму неполучается что-то. Составьте программу находящую значение определенного интеграла. Пределы интегрирования и шаг интегрирования задаются пользователем. По-дынтегральная функция задается в тексте программы. Значение интеграла нахо-дится по формуле прямоугольников.
C++ Как запретить присваивание?
Как лучше запретить присваивание? Заприватить оператор и не делать его реализацию? Или как?
C++ Виснет длл http://www.cyberforum.ru/cpp-beginners/thread602781.html
Всем привет. Сорри если не туда. Есть некая библиотека mouse.dll, которая имитирует человеческие движения, к библиотеке одновременно обращается несколько приложений. Так вот все правильно работает, только dll стабильно зависает через 3 - 40 минут без загрузки проца. Никто не подскажет где может быть косяк? Буду рад любым идеям, заранее спасибо. / mousedll.cpp : Defines the entry point for the...
C++ как удалить из строки пробелы либо массив char либо string как вам угодно помогите пожайлуста подробнее

Показать сообщение отдельно
Serg046
21 / 21 / 2
Регистрация: 07.01.2010
Сообщений: 376
11.06.2012, 19:42     Работа с мьютексами
Разбираюсь с мьютексами.
При таком коде у меня ShowMessage не срабатывает, как я и ожидаю
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Enabled = false;
Memo1->Clear();
HANDLE h = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&threadMain,
        NULL, NULL, NULL );
 
HANDLE hM = CreateMutex(NULL, true, "SyncKey");
hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, "SyncKey");
 
CloseHandle(h);
Button1->Enabled = true;
}
 
void thread1()
{
hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, "SyncKey");
WaitForSingleObject(hMutex, INFINITE);
ShowMessage("ds");
 
HANDLE h = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&thread2,
        NULL, NULL, NULL );
 
CloseHandle(h);
ExitThread(0);
}
А если делаю так, то срабатывает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Enabled = false;
Memo1->Clear();
HANDLE h = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&threadMain,
        NULL, NULL, NULL );
 
HANDLE hM = CreateMutex(NULL, true, "SyncKey");
hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, "SyncKey");
 
CloseHandle(h);
Button1->Enabled = true;
}
//---------------------------------------------------------------------------
 
void threadMain()
{
HANDLE h = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&thread1,
        NULL, NULL, NULL );
//HANDLE hM = CreateMutex(NULL, true, "SyncKey");
//hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, "SyncKey");
 
CloseHandle(h);
}
 
void thread1()
{
hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, "SyncKey");
WaitForSingleObject(hMutex, INFINITE);
ShowMessage("ds");
 
HANDLE h = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&thread2,
        NULL, NULL, NULL );
 
CloseHandle(h);
ExitThread(0);
}
В общем расскажите про все способы как делать ожидание.. А то что-то не пойму. Ну типа создал мьютекс, после в этом же потоке поставил WaitForSingleObject, че-то там делаешь в разных потоках, потом сделал ResumeMutex и управление перешло к первому потоку.

Добавлено через 1 час 50 минут
Разобрался

Добавлено через 52 минуты
Нет не разобрался)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
CreateMutex(NULL, true, "SyncKey");
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Enabled = false;
Memo1->Clear();
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&threadMain,
        NULL, NULL, NULL );
Button1->Enabled = true;
}
//---------------------------------------------------------------------------
 
void threadMain()
{
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&thread1,
        NULL, NULL, NULL );
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, "SyncKey");
WaitForSingleObject(hMutex, INFINITE);
ShowMessage("ds");
}
 
void thread1()
{
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&thread2,
        NULL, NULL, NULL );
ExitThread(0);
}
 
void thread2()
{
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&thread3,
        NULL, NULL, NULL );
ExitThread(0);
}
 
void thread3()
{
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, "SyncKey");
ReleaseMutex(hMutex);
CloseHandle(hMutex);
ExitThread(0);
}
Не показывается сообщение, а то есть thread3 не освобождает мьютекс.
Где-то читал что мол надо освобождать в владельце мьютекса.
Но, даже если, то как это делать
если в этом коде после WaitToSingleObject ничего выполняться не будет, хотя по идеи в первый раз должно все прекрасно отработать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
CreateMutex(NULL, true, "SyncKey");
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Button1->Enabled = false;
Memo1->Clear();
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&threadMain,
        NULL, NULL, NULL );
}
//---------------------------------------------------------------------------
 
void threadMain()
{
CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)&thread1,
        NULL, NULL, NULL );
HANDLE hMutex = OpenMutex(MUTEX_ALL_ACCESS, false, "SyncKey");
WaitForSingleObject(hMutex, INFINITE);
ShowMessage("ds");
//я здесь не смогу очистить, т.к. сюда не прийду
Form->Button1->Enabled = true;
}
Добавлено через 55 минут
Все разобрался. Надо было при создании мьютекса false вторым параметром поставить, или сразу его очистить сначала.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 05:31. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru