Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация с потоком 
V
    Опции темы
Wing
Дата 22.4.2006, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



Доброго времени суток. Прочитал материал по синхронизации потоков, там целая тьма способов Event, Mutex, Semaphore... Однако все они также используются для межпроцессной синхронизации, а есть что-нить в пределах одного приложения или можно для такой цели использовать обычные глобальные переменные. 
PM MAIL ICQ   Вверх
Poseidon
Дата 22.4.2006, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 10
Всего: 133



Что именно подразумевается под синхронизацией потоков? Что нужно реализовать? У TThread есть куча стандартных методов, нужно только знать, что нужно smile 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Wing
Дата 22.4.2006, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



Есть некоторая прога которая создает поток для некоторой цели, в ходе работы поток передает информацию о своем состоянии в основной поток. Если основной поток занят то второй поток должен продолжить свое выполнение без передачи данных. 
Собственно можно-ли использовать переменную типа Boolean для индикации занят/свободен основного потока. 

Это сообщение отредактировал(а) Wing - 22.4.2006, 19:03
PM MAIL ICQ   Вверх
Snowy
Дата 22.4.2006, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(Wing @  22.4.2006,  18:56 Найти цитируемый пост)
Собственно можно-ли использовать переменную типа Boolean для индикации занят/свободен основного потока. 
Можно, но не стоит.
Почитай про критические секции. (Critical Sections) 
PM MAIL   Вверх
Sunvas
Дата 23.4.2006, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: нет
Всего: 89



Цитата(Wing @  22.4.2006,  18:56 Найти цитируемый пост)
 Если основной поток занят

Что ты под этим подразумевашь?
synchronize({имя процедуры}) 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Wing
Дата 23.4.2006, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



Цитата(Sunvas @  23.4.2006,  00:28 Найти цитируемый пост)
Что ты под этим подразумевашь?
synchronize({имя процедуры}) 

Я имею ввиду что поток занят некоторой работой.

Цитата(Snowy @  22.4.2006,  22:44 Найти цитируемый пост)
Можно, но не стоит.
Почитай про критические секции. (Critical Sections) 

Во! Ты меня понял. Как можно такое обойти?  

Это сообщение отредактировал(а) Wing - 23.4.2006, 15:30
PM MAIL ICQ   Вверх
Rouse_
Дата 23.4.2006, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Цитата(Wing @  22.4.2006,  19:56 Найти цитируемый пост)
Если основной поток занят то второй поток должен продолжить свое выполнение без передачи данных. 

создаешь область хранения, к которой должен обратиться основной поток, к примеру тот-же MemoryMappedFile и через PostMesssage отправляешь ему адрес этой области. Когда главный поток освободиться, он примет твое сообщение и прочитает переданные ему данные находящиеся по переданному указателю, чтобы избежать утечек, желательно после прочтения разрушить MMF. 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Snowy
Дата 23.4.2006, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 30
Всего: 484



Цитата(Wing @  22.4.2006,  18:56 Найти цитируемый пост)
Есть некоторая прога которая создает поток для некоторой цели, в ходе работы поток передает информацию о своем состоянии в основной поток. Если основной поток занят то второй поток должен продолжить свое выполнение без передачи данных. 
Для перехода в занятое состояние, главный поток захватывает критическую секцию и начинает работу. Как закончит - освобождает крстическую секцию.
Второй поток хочет передать данные. Он пробует захватить критическую секцию. Если не удалось, значит занято. Работаем дальше. Если не занято - захватывает критическую секцию, пишет данные, освобождает, шлет сообщение главному потоку о том, что данные легли - обрабатывай. Главный захватывает критическую секцию, читает данные, обрабатывает, освобождает... и т.д. 
PM MAIL   Вверх
Rouse_
Дата 23.4.2006, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Snowy, ты кудато не сюда. Зачем главному потоку захват критичской секции когда он должен обрабатывать данные пришедшие от дочерних? 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Wing
Дата 23.4.2006, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



Ну допустим такой проект: 

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  ScanEngine.zip 4,66 Kb
PM MAIL ICQ   Вверх
Rouse_
Дата 23.4.2006, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Wing, Это в чем юмор вот этого ?

Код

          hMMF := CreateFileMapping($FFFFFFFF, nil, 0, 0, SizeOf(TMyInfoBuffer), 'MyInfoBuffer');
          p := MapViewOfFile(hMMF, 0, 0, 0, SizeOf(TMyInfoBuffer));
          p^.hMMF := hMMF;

По какой книжке так писал? 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Wing
Дата 23.4.2006, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



Цитата(Rouse_ @  23.4.2006,  20:28 Найти цитируемый пост)
Это в чем юмор вот этого ?

Цитата(Rouse_ @  23.4.2006,  15:31 Найти цитируемый пост)
MemoryMappedFile


Цитата(Rouse_ @  23.4.2006,  20:28 Найти цитируемый пост)
По какой книжке так писал? 
Ни по какой. Потому что в той которая есть ни чего полезного нету - стало быть... плохая книжка. 

Писал по памяти + Win32 SDK Reference.



 
PM MAIL ICQ   Вверх
Rouse_
Дата 24.4.2006, 08:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Блин, или я не правильно обьясняю или одно из двух smile
Смотри пример:

Код

unit Unit9;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

const
  WM_THREAD_NOTIFY = WM_USER + 1;

type
  PTestThreadStructure = ^TTestThreadStructure;
  TTestThreadStructure = packed record
    IntParam: Integer;
    StringParam: ShortString;
  end;

  TForm9 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    procedure FormShow(Sender: TObject);
  private
    procedure WMThreadNotify(var Message: TMessage); message WM_THREAD_NOTIFY;
  end;

  TTestThread = class(TThread)
  private
    hMainThreadHandle: THandle;
  protected
    procedure Execute; override;
  end;

var
  Form9: TForm9;

implementation

{$R *.dfm}

procedure TForm9.FormShow(Sender: TObject);
var
  I: Integer;
begin
  with TTestThread.Create(True) do
  begin
    FreeOnTerminate := True;
    hMainThreadHandle := Form9.Handle;
    Resume;
  end;
  for I := 0 to $FFFF do
    if (I mod 16) = 0 then
      Memo1.Lines.Add(InttoStr(I));   
end;

procedure TForm9.WMThreadNotify(var Message: TMessage);
var
  AData: TTestThreadStructure;
begin
  AData := PTestThreadStructure(Message.WParam)^;
  Memo2.Lines.Add('Текущее значение в потоке: ' + IntToStr(AData.IntParam) +
    sLineBreak + AData.StringParam);
  UnmapViewOfFile(PTestThreadStructure(Message.WParam));
  CloseHandle(Message.LParam);
end;

{ TTestThread }

procedure TTestThread.Execute;
var
  I: Integer;
  hMMF: THandle;
  AData: TTestThreadStructure;
  pData: PTestThreadStructure;
begin
  for I := 0 to $FF do
    if (I mod 48) = 0 then
    begin
      hMMF := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 4, nil);
      pData := MapViewOfFile(hMMF, FILE_MAP_WRITE, 0, 0, 0);
      AData.IntParam := I;
      AData.StringParam := 'Осталось обработать ' +
        IntToStr($FF - I) + ' значений';
      pData^ := AData;
      if not PostMessage(hMainThreadHandle, WM_THREAD_NOTIFY,
        Integer(pData), hMMF) then RaiseLastOSError;
    end;
end;

end.


Тут главный поток занят своим делом, паралельно с ним трудиться второй поток, когда главный освободиться он примет все данные от второстепенного smile 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Wing
Дата 25.4.2006, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 19.3.2006

Репутация: нет
Всего: нет



Цитата(Rouse_ @  24.4.2006,  08:59 Найти цитируемый пост)
Блин, или я не Паправильно обьясняю или одно из двух 

Хм. Видимо воторое smile
Спасибо.

Однако вопрос был в другом: как сделать флажок для главного потока? Ибо второй поток не должен отправлять данные если первый занят.  

Это сообщение отредактировал(а) Wing - 25.4.2006, 22:19
PM MAIL ICQ   Вверх
Rouse_
Дата 26.4.2006, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 469
Регистрация: 23.4.2005

Репутация: 18
Всего: 29



Хм, а смысл? Поток всеравно должен гдето буферизировать данные. ИМХО данный вариант который я тебе показал самый оптимальный для тебя, т.к. второй поток не отправляет данные а всего лишь ложит их во времнное хранилище и сигнализирует главному что данные на месте. Когда главный захочет читать - тогда и прочитает..
Главномне обязательно читать сразу по приходу WM_THREAD_NOTIFY, он также может просто запомнить где нибудь у себя указатель на данные, а прочитать их позднее... 


--------------------
 Vae Victis
(Горе побежденным (лат.))
Демо с открытым кодом: http://rouse.drkb.ru 
PM MAIL WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0663 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.