Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.06.2007, 22:06   #1
Miha
Пользователь
 
Регистрация: 26.05.2007
Сообщений: 10
Восклицание как работать с параллельными потокакми в Winapi?

Пожалуйста обьясните как создать и работать с потоками при помощи функций Winapi или ссылку хотябы кинте, а то в инете нигде пример не нашёл.
P.s. Нашёл тока ф-ию CreateThread и то незнаю как с ней работать ( .
Miha вне форума Ответить с цитированием
Старый 26.06.2007, 12:19   #2
Rouse_
Пользователь
 
Аватар для Rouse_
 
Регистрация: 31.05.2007
Сообщений: 56
По умолчанию

Пример создания четырех потоков с синхронизацией через семафор

Код:
 
program Project1;
 
uses
  Windows, Messages, SysUtils, gssocket;
 
const
  THREAD_COUNT = 4;
 
var
  hSemaphore: THandle;
  hThread: array [0..THREAD_COUNT - 1] of THandle;
  lpThreadId, lpPreviousCount: DWORD;
  I: Integer;
 
procedure ThreadProc(lpParameter: Pointer); stdcall;
var
  hThreadSemaphore: THandle;
begin
  // рабочая процедура потоков
  // кажды поток ждет сигнального состояния семафора
  case WaitForSingleObject(hSemaphore, 100000) of
  // семафор в сигнальном состоянии, либо ошибка - обрабатываем код завершения
    WAIT_OBJECT_0:  // все нормально
      MessageBox(0, PChar('WAIT_OBJECT_0: ' + IntToStr(Integer(lpParameter))), nil, MB_OK);
    WAIT_FAILED:    // ошибка
      MessageBox(0, PChar('WAIT_FAILED: ' + IntToStr(Integer(lpParameter))), nil, MB_OK);
    WAIT_TIMEOUT:   // истекло время ожидания
      MessageBox(0, PChar('WAIT_TIMEOUT: ' + IntToStr(Integer(lpParameter))), nil, MB_OK);
  end;
end;
 
begin
  // Создаем семафор
  hSemaphore := CreateSemaphore(nil, 0, THREAD_COUNT, 'TestThreadSemaphore');
  if hSemaphore = 0 then
    RaiseLastOSError;
  // Создаем 4 потока
  for I := 0 to THREAD_COUNT - 1 do
    hThread[I] := CreateThread(nil, 0, @ThreadProc, Pointer(I), 0, lpThreadId);
  lpPreviousCount := THREAD_COUNT;
  // Ждем секунду
  Sleep(1000);
  // Освобождаем 1 поток
  if not ReleaseSemaphore(hSemaphore, 1, @lpPreviousCount) then
    RaiseLastOSError;
  // Ждем 2 секунды
  Sleep(2000);
  // Освобождаем еще два потока
  if not ReleaseSemaphore(hSemaphore, 2, @lpPreviousCount) then
    RaiseLastOSError;
  // Ждем 2 секунды
  Sleep(2000);
  // Освобождаем последний поток
  if not ReleaseSemaphore(hSemaphore, 1, @lpPreviousCount) then
    RaiseLastOSError;
  Sleep(2000);
end.
Vae Victis
(Горе побежденным (лат.))
Демки с открытым кодом:
http://rouse.drkb.ru
Rouse_ вне форума Ответить с цитированием
Старый 26.06.2007, 19:45   #3
Miha
Пользователь
 
Регистрация: 26.05.2007
Сообщений: 10
По умолчанию

Спасибо Rouse_ буду разбираться .
Miha вне форума Ответить с цитированием
Старый 26.06.2007, 21:13   #4
Miha
Пользователь
 
Регистрация: 26.05.2007
Сообщений: 10
Вопрос

... разобрал я пример и у меня возникло несколько банальных вопросов:
1) Используется ли в примере модуль gssocket ,если да то почему.(я так понял что это интернет сокеты да причём ещё не являются стандартными).
2)Правильно ли я понял что в этом примере потоки используют процедуру ThreadProc?(вопрос конечно ламерский,но я так для уточнения ).
3)У меня при завершении потока происходит ошибка.Это так и должно быть?
4)Потоку передаётся параметр с его номером? 4-ой переменной ф-ии CreateThread (pointer) ?
5)Синхронность потоков заключаеся в WaitForSingleObject(hSemaphore, 100000) ?Значит поток ожидает сообщение от симафора ...А тип сообщения симафора заключается в ReleaseSemaphore или в самом хэндле hSemaphore?
И последнее : как можно релизовать передачу значения переменной дополнительного потока из главного. Стандартными средствами это будет примерно выглядеть так :
Thread:=TThread.Create(true);
Thread.Str :=S;
Thread.resume;
ну тоесть желательно передать переменной значение перед его запуском.
Ну вот вроде всё ...пока всё .
Miha вне форума Ответить с цитированием
Старый 27.06.2007, 09:12   #5
Rouse_
Пользователь
 
Аватар для Rouse_
 
Регистрация: 31.05.2007
Сообщений: 56
По умолчанию

1. gssocket - это я в параллель на другой вопрос отвечал, в эьтом модуле данный юнит лишний
2. да
3. какого плана ошибка?
4. да
5. да, по поводу типов поштудируй MSDN
6. через четвертый параметр функции
Vae Victis
(Горе побежденным (лат.))
Демки с открытым кодом:
http://rouse.drkb.ru
Rouse_ вне форума Ответить с цитированием
Старый 27.06.2007, 21:06   #6
Miha
Пользователь
 
Регистрация: 26.05.2007
Сообщений: 10
По умолчанию

3)Ошибка WAIT_FAILED (описаная в CASE )
Miha вне форума Ответить с цитированием
Старый 27.06.2007, 21:38   #7
Miha
Пользователь
 
Регистрация: 26.05.2007
Сообщений: 10
По умолчанию

И ещё один вопрос: объязательно присваивать каждый поток в отдельный хэндл или это только чтобы можно было узнать результат создания потока?
Miha вне форума Ответить с цитированием
Старый 27.06.2007, 22:32   #8
Miha
Пользователь
 
Регистрация: 26.05.2007
Сообщений: 10
По умолчанию

Всё разобрался сам. Спасибо за помощь .
Miha вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
WinApi и C++ titan-prog Win Api 1 17.07.2008 21:02
WinApi Necrom Помощь студентам 3 27.06.2008 14:24
WinApi Andr Безопасность, Шифрование 3 17.06.2007 13:38
WinAPI функции AidarBik Win Api 3 16.06.2007 17:03