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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.01.2014, 01:13   #1
Vadik(R)
Пользователь
 
Регистрация: 10.03.2008
Сообщений: 68
По умолчанию Проблема синхронизации WinAPI потоков

Хочу сделать так, чтобы поток получал уникальное число, затем обрабатывал как-то его, но не получается раздавать потокам уникальные числа для обработки. Подскажите, в чём может быть проблема?
Вот код:
Код:
program MultiThread;

{$APPTYPE CONSOLE}

uses
  Classes, SysUtils, Windows;

var
  Finish, i, Number, Start, ThreadsCount: Integer;
  Mutex: THandle;
  ThreadId: Cardinal;
  Threads: Array [1..100] of THandle;

function GetNext: Integer;
begin
  WaitForSingleObject(Mutex, INFINITE);
  Result := Number;
  if Number <= Finish then
  begin
    Number := Number + 1;
  end;
  ReleaseMutex(Mutex);
  Writeln('Current number is: ', Result);
end;

function GrabbingThread(Parameter: Pointer): Cardinal; stdcall;
var
  Number: Integer;
begin
  Number := GetNext;
  while Number <= Finish do
  begin
    Number := GetNext;
  end;
  Result := 0;
end;

begin
  IsMultiThread := True;
  Write('From id: ');
  Readln(Start);
  Write('To id: ');
  Readln(Finish);
  Write('Number of threads: ');
  Readln(ThreadsCount);
  Mutex := CreateMutex(nil, False, nil);
  Number := Start;
  for i := 1 to ThreadsCount do
  begin
    Threads[i] := CreateThread(nil, 0, @GrabbingThread, nil, 0, ThreadId);
  end;
  WaitForMultipleObjects(ThreadsCount, @Threads, True, INFINITE);
  for i := 1 to ThreadsCount do
  begin
    CloseHandle(Threads[i]);
  end;
  CloseHandle(Mutex);
  Readln;
end.
И результат его работы:

Последний раз редактировалось Vadik(R); 13.01.2014 в 01:16.
Vadik(R) вне форума Ответить с цитированием
Старый 13.01.2014, 01:27   #2
Vadik(R)
Пользователь
 
Регистрация: 10.03.2008
Сообщений: 68
По умолчанию

Стоило только отписаться о проблеме на форуме, как пришло озарение:
Код:
program MultiThread;
 
{$APPTYPE CONSOLE}
 
uses
  Classes,
  SysUtils,
  Windows;

var
  Finish, i, Number, Start, ThreadsCount: Integer;
  Mutex: THandle;
  Records: Array [1..100] of Integer;
  ThreadId: Cardinal;
  Threads: Array [1..100] of THandle;
 
function GetNext: Integer;
begin
  WaitForSingleObject(Mutex, INFINITE);
  Result := Number;
  if Number <= Finish then
  begin
    Number := Number + 1;
  end;
  ReleaseMutex(Mutex);
  Writeln('Current number is: ', Result);
end;
 
function GrabbingThread(Parameter: Pointer): Cardinal; stdcall;
var
  Number: Integer;
begin
  Number := GetNext;
  while Number <= Finish do
  begin
    Records[Number] := Number;
    Number := GetNext;
  end;
  Result := 0;
end;
 
begin
  IsMultiThread := True;
  Write('From id: ');
  Readln(Start);
  Write('To id: ');
  Readln(Finish);
  Write('Number of threads: ');
  Readln(ThreadsCount);
  Mutex := CreateMutex(nil, False, nil);
  Number := Start;
  for i := 1 to ThreadsCount do
  begin
    Threads[i] := CreateThread(nil, 0, @GrabbingThread, nil, 0, ThreadId);
  end;
  WaitForMultipleObjects(ThreadsCount, @Threads, True, INFINITE);
  for i := 1 to ThreadsCount do
  begin
    CloseHandle(Threads[i]);
  end;
  CloseHandle(Mutex);
  Readln;
  for i := 1 to Finish - Start + 1 do
  begin
    Writeln(Records[i]);
  end;
  Readln;
end.
Дело всё в том, что я многопоточно пытаюсь вывести в стандартный поток вывода, вот он и глючит. Сами потоки получают нужные числа:
Vadik(R) вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AccessVolation при синхронизации потоков hiho Общие вопросы Delphi 2 27.10.2012 08:29
winapi, синхронизация потоков LockHeart Общие вопросы C/C++ 3 18.11.2011 12:25
Проблема синхронизации потоков Teor Общие вопросы .NET 4 17.06.2011 15:50
Проблема синхронизации. beda Microsoft Office Word 3 30.06.2010 13:37
Реализация функций синхронизации потоков. натка Помощь студентам 1 03.01.2008 15:26