Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
20 / 19 / 2
Регистрация: 27.06.2008
Сообщений: 105
1

Про потоки

08.07.2008, 01:04. Показов 2628. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Если я к проге приделал два потока (Thread), один другому не будет мешать?

Просто когда я в проге запускаю один поток, все норм.. как только запускаю второй.. первый игнорится начинает..

Если мешают, как обойти???
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.07.2008, 01:04
Ответы с готовыми решениями:

Про видео и про событие формы)
Народ, у мня тут два вопросика есть. Надеюсь что кто-то знает ответы) Делаю воспроизведение видео,...

2 вопроса про цикл и про FileCreate
1.При выполнении прога зависает: int count = 1; AnsiString myF; ...

Про потоки
Всех с Рождеством! Вопрос к профи. Существует процедура создания потоков, у потоков есть...

Подскажите про потоки
Подскажите пожалуйста где можно почитать про потоки, что это такое, и как их использовать может...

10
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.07.2008, 01:22 2
Хм. Это смотря, как ты их делал. может, они к общим данным лезут, может, глобальные переменные, может к ресурсам одним обращаются и т. д. и т. п.
Читай про:
1. семафоры
2. события
3. мьютексы
4. критические секции
0
20 / 19 / 2
Регистрация: 27.06.2008
Сообщений: 105
08.07.2008, 01:27  [ТС] 3
Сделал их File > New > Thread Object =)
В появившемся юните заклепал свой код.. ну есессно объявил его где надо))
получилось два доп. юнита которые вызываются и крутятся в бесконечном цикле..

один ловит сообщения о нажатии на клавиши..
другой прокручивает окна (enumwindow) ну и ловит нужные..

один другому мешать начинает...

Если про семафоры и т.д... то можешь ткнуть меня в конкретную статью??
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.07.2008, 01:36 4
Google ткнет
Если они ничего общего не юзают, то не должны бы. Приоритеты задай. Каким образом мешает?
0
20 / 19 / 2
Регистрация: 27.06.2008
Сообщений: 105
08.07.2008, 01:46  [ТС] 5
ну в общем смотри ситеуация..

У меня запускается прога и с ней поток, который прокручивает окна (enumwindow), потом если хендл окна совпадает с указанным ранее, то прога заканчивает все свои действа и закрывается..
так вот в время работы проги, нажимается кнопка (пользователем) и запускается поток отлавливания клавиши F11..

ну в первом потоке цикл обеспечивает сама функция enumwindow.. во втором же цикл обеспечивает функция GetMesage

Так вот.. когда нажимается кнопка и запускается поток №2 (по клавише), то поток №1 перестает реагировать.. т.е. даже если появляется в в процессе то самое окно которое он ловит, то он не реагирует должным образом(((

Вот такие пироги.. там даже памяти нет одинаковой.. работаю с разными вещами даже..

Вот код первого потока: (enumwindows)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
__fastcall ThrCheat::ThrCheat(bool CreateSuspended)
        : TThread(CreateSuspended)
{
//Освобождение памяти при уничтожении потка
FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall ThrCheat::Execute()
{
   //Синхронизируем поток с функцией TestF
   while(Terminated!=true)
   Synchronize(TostF);
}
//---------------------------------------------------------------------------
 
BOOL CALLBACK MyEnum(HWND hwnd,LPARAM lParam){
 
HWND hw1 = FindWindow(NULL, "Speed Gear Trial Edition !");
HWND hw2 = FindWindow(NULL, "Speed Gear v5.00 - Unregistered");
HWND hw3 = FindWindow("notepad" ,NULL);
 
//ShowWindow(hw3, SW_SHOWNORMAL);
  if (hw1 == hwnd || hw2 == hwnd || hw3 == hwnd)
  {
        //При обнаружении чита закрываем лаунчер
        HWND laun = FindWindow("TForm1", "Mu Indigo - [url]www.mu-indigo.ru[/url] (с) by eXire");
        if (laun != 0)
        {
                 //Извлекаем ProcessID этого окна/процесса
                 DWORD lpdwProcessId2;
                 GetWindowThreadProcessId(laun, &lpdwProcessId2);
 
                 DWORD ExitCode2;
                 HANDLE hp2;
                 //Уничтожение процесса лаунчера
                 if(lpdwProcessId2)
                       {
                       //Получаем Хендл процесса
                       hp2 = OpenProcess(PROCESS_ALL_ACCESS, true, lpdwProcessId2);
                       if (hp2)
                               {
                               //Уничтожаем процесс
                               GetExitCodeProcess(hp2, &ExitCode2);
                               TerminateProcess(hp2, ExitCode2);
                               }
                       }
 
                 CloseHandle(hp2);
        }
    return FALSE;
  }
  else
  {
    return TRUE;
  }
}
 
void __fastcall ThrCheat::TostF()
{
        EnumWindows((WNDENUMPROC)MyEnum, 1);
}
Вот код второго потока (по клавише F11):
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
int k = 5;
int hide = 0;
 
__fastcall MsgThread::MsgThread(bool CreateSuspended)
   : TThread(CreateSuspended)
{
//Освобождение памяти при уничтожении потка
FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
void __fastcall MsgThread::Execute()
{
   //Синхронизируем поток с функцией TestF
   while(Terminated!=true)
   Synchronize(TestF);
}
//---------------------------------------------------------------------------
void __fastcall MsgThread::TestF()
{
//РЕГИСТРАЦИЯ КЛАВИШИ
 HWND hadler = FindWindow("TForm1", "Mu Indigo - [url]www.mu-indigo.ru[/url] (с) by eXire");
 RegisterHotKey(hadler, 1, NULL, VK_F11);
// RegisterHotKey(hadler, 2, NULL, VK_F12);
 MSG  msg;
//ОТЛАВЛИВАЕМ СООБЩЕНИЯ И ИИЩЕМ СООБЩЕНИЕ О НАЖАТИИ ЗАРЕГИСТРИРОВАННОЙ КЛАВИШИ
 while(GetMessage(&msg,NULL,0,0))
 {
 
   if (msg.message == WM_HOTKEY)
   {
      if (msg.wParam == 1)
      {
//Обработчик клавиши F11
 
        //ShowMessage("F11");
        //HWND hWnd = FindWindow(NULL, "ЖжјЈґ°їЪНж [url]http://cesdn.net[/url] №ШЧўРВ°ж");
        HWND hWnd = FindWindow("MU", NULL);
        SetWindowText(hWnd,"Indigo MuOnline");
 
//Задаем параметры отображения окна при нажатии клавиши
        WINDOWPLACEMENT w;
        w.length = sizeof(WINDOWPLACEMENT);
        if(hide==0){
        w.showCmd = SW_HIDE;
        hide = 1;
        }
        else{
        w.showCmd = SW_SHOW;
        hide = 0;
        }
        RECT r;
        GetWindowRect(hWnd, &r);
        w.rcNormalPosition = r;
        SetWindowPlacement(hWnd, &w);
      }
   }
   //Возвращаем сообщение о нажатой клавише обратно системе Windows
   TranslateMessage(&msg);
   DispatchMessage(&msg);
 }
}
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.07.2008, 02:10 6
У тебя отладчик перед глазами с билдером. Проверь, работает ли поток вообще.
Интересно...в потоках ищется одно и то же окно, в одном регится хоткей, а в другом уничтожается процесс создавший это окно.
0
20 / 19 / 2
Регистрация: 27.06.2008
Сообщений: 105
08.07.2008, 02:15  [ТС] 7
По отдельности потоки работают..

Добавлено через 4 минуты
А потоки работают с одним и тем же окном.. только это окно и есть главная форма)))
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.07.2008, 12:10 8
Эм...а зачем регить хоткей на окно, если его процесс убивается?
Я спрашивал не про "по отдельности". А работает ли первый поток, когда второй запущен. То, что нет реакции, это не значит, что не работает. Поставь брейкпойнт там...или вывод какой.
0
0 / 0 / 0
Регистрация: 19.04.2015
Сообщений: 1
08.07.2008, 13:14 9
Вызов Synchronize() из Execute() это переход в ... основную нить процесса. То есть оба Ваших потока практически всегда выполняются в контексте основной нити. Поэтому и работает только один из них - тот, который раньше вызовет Synchronize().

Цитата Сообщение от AsFalt Посмотреть сообщение
...Вот такие пироги.. там даже памяти нет одинаковой.. работаю с разными вещами даже..
Так уберите вызов Synchronize().
0
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
08.07.2008, 13:28 10
Хех, реально из-за этого? Билдер совсем забывать стал
0
20 / 19 / 2
Регистрация: 27.06.2008
Сообщений: 105
08.07.2008, 15:48  [ТС] 11
Добавлено через 1 минуту
Цитата Сообщение от Vourhey Посмотреть сообщение
Эм...а зачем регить хоткей на окно, если его процесс убивается?
Я спрашивал не про "по отдельности". А работает ли первый поток, когда второй запущен. То, что нет реакции, это не значит, что не работает. Поставь брейкпойнт там...или вывод какой.
Я не знаю другого способа узнать PID
0
08.07.2008, 15:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.07.2008, 15:48
Помогаю со студенческими работами здесь

Вопрос про потоки
Насколько я понял, единственный способ запустить поток — это MyThread.Resume и запустится Execute,...

опять про потоки
привет всем есть поток procedure TDownLoader.Execute; var http:TIdHTTP; ...

Про потоки с нуля
Пробую осилить потоки по записи в блоге от krapotkin Читал много, но эта запись далась легче...

Ищу литературу про потоки
Дайте, пожалуйста, нормальный ресурс где будет хорошо объяснено про потоки, мьютексы, семантика и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru