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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация потока, созданного при помощи createthread 
:(
    Опции темы
Sunvas
Дата 15.12.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



alexeis1Snowy, спасибо. В теории постепенно начинаю догадываться... Уже прогресс! smile 
Но вот как привязать к синхронизации form1.Button2.Click;?


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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Sunvas @  15.12.2006,  14:38 Найти цитируемый пост)
Но вот как привязать к синхронизации form1.Button2.Click;? 

  Просто ее нужно вызывать только после того как остановлен главный поток. Пока главный поток спит, работает всего один единственный поток, потому он уже ни с кем не конфликтует и можно вызывать все что угодно. Главное потом разбудить спящего smile.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Sunvas
Дата 15.12.2006, 15:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(alexeis1 @  15.12.2006,  14:58 Найти цитируемый пост)
Просто ее нужно вызывать только после того как остановлен главный поток.

Как из-под треда остановить основной поток?

Цитата(alexeis1 @  15.12.2006,  01:29 Найти цитируемый пост)
CheckSynchronize;

Если вызывать эту функцию из потока, то вылазит ошибка. smile 

Цитата(alexeis1 @  15.12.2006,  01:29 Найти цитируемый пост)
TThread.Synchronize(ASyncRec: PSynchronizeRecord);

Цитата(alexeis1 @  15.12.2006,  00:59 Найти цитируемый пост)
А блин, она в привате 
Ну тогда просто сделать процедуру и включить в нее этот код.

Если вытскивать код процедуры в мою процедуру - она перестает работать. smile 



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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(Sunvas @  15.12.2006,  15:43 Найти цитируемый пост)
Если вызывать эту функцию из потока, то вылазит ошибка.

Не правильно понял! Эту функцию вызывает основной поток для того, чтобы дополнительный поток мог его заблокировать. Нужно просто войти в указанную критическую секцию и дождаться пока на ней же заблокируется основной поток.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Sunvas
Дата 15.12.2006, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(alexeis1 @  15.12.2006,  16:02 Найти цитируемый пост)
Не правильно понял! Эту функцию вызывает основной поток для того, чтобы дополнительный поток мог его заблокировать. Нужно просто войти в указанную критическую секцию и дождаться пока на ней же заблокируется основной поток.

Можешь код нарисовать? А то уже танцую с бубенцом вокруг этой проблемы со вчерашнего дня.


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


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Оказывается у класса TThread все нужные методы являются методами класса. Вот он метод, который позволит сделать очень просто синхронизацию.
Код

class procedure TThread.Synchronize(AThread: TThread; AMethod: TThreadMethod);


Единственное, неудобство, что ему нужно передавать метод, а не процедуру, но и это на самом деле несложно обойти, но в данном случае не суть.

Если первый параметр NIL то синхронизация будет производится с основным потоком.
В качестве метода я использовал метод формы.

Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    BeginTread: TButton;
    StopTread: TButton;
    Shape1: TShape;
    Timer1: TTimer;
    procedure BeginTreadClick(Sender: TObject);
    procedure StopTreadClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    procedure TempProc;
    { Public declarations }
  end;

var
  Form1     : TForm1;
  ThrHandle : THandle;
  ThrID     : THandle;

implementation

{$R *.dfm}

procedure TForm1.TempProc;
begin
  while True do;
end;

function treadfunct(p: Pointer): DWORD; stdcall;
begin
  TThread.Synchronize(nil, Form1.TempProc);
  ExitThread(0);
end;

procedure TForm1.BeginTreadClick(Sender: TObject);
begin
  ThrHandle := CreateThread(nil, 0, @treadfunct, nil, 0, ThrID);
  if ThrHandle = 0 then ShowMessage('error');
end;

procedure TForm1.StopTreadClick(Sender: TObject);
begin
  CloseHandle(ThrHandle);
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Shape1.Brush.Color := RGB(Random(256),Random(256),Random(256))
end;


BeginTreadClick - создает поток и запускает его функцию treadfunct, которая тут же пытается синхронизироваться с основным потоком. Во время паузы между вызовом таймера ей это удается и пока она выполняется, перерисовка останавливается, нетрудно увидеть, что просто метод 
TempProc зациклен, потому пока он будет выполняться, основной поток будет залочен, все что в нем (в TempProc) будет безопасно работать с VCL.

Это получается абсолютный аналог Sincronize; - свойства класса TThread. Хочу заметить что объект класса TThread не создается (да и не может быть создан, ведь он абстрактный).  



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Sunvas
Дата 15.12.2006, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Большое спасибо!
alexeis1, давно бы так. А то танцевали с бубеном вокруг горшка...

ЗЫ. Думаю тема весьма полезная - ее стоит почистить, закрыть и оставить следующим поколениям на обозрение.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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