Проблема Синхронизации Winapi Потоков

Тема в разделе "Delphi - FAQ", создана пользователем Vadik(R), 13 янв 2014.

  1. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Всё-таки осталась ещё проблемка с мнопоточностью в делфи. Хочу сделать так, чтобы поток получал уникальное число, затем обрабатывал как-то его, но не получается раздавать потокам уникальные числа для обработки. Подскажите, в чём может быть проблема?
    Вот код:
    Код (Delphi):
    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.
    И результат его работы:
    [​IMG]
     
  2. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    И снова, стоило только отписаться о проблеме на форуме, как пришло озарение:
    Код (Delphi):
    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.
    Дело всё в том, что я многопоточно пытаюсь вывести в стандартный поток вывода, вот он и глючит. Сами потоки получают нужные числа:
    [​IMG]
     
Загрузка...
Похожие Темы - Проблема Синхронизации Winapi
  1. AgniXRudra
    Ответов:
    2
    Просмотров:
    52
  2. Zloikaktus
    Ответов:
    0
    Просмотров:
    29
  3. c0de3r
    Ответов:
    5
    Просмотров:
    153
  4. DobermannTT
    Ответов:
    10
    Просмотров:
    158
  5. SoulPaladin
    Ответов:
    4
    Просмотров:
    144

Поделиться этой страницей