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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не могу синхронизировать, Потоки 
:(
    Опции темы
zalex
Дата 26.5.2005, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Привет всем!

Есть поток, который знает только HWND главной формы и ничего больше о ней. Этот поток только и может, что отправлять сообщение

SendMessage этому HWND. Главная форма умеет получать сообщение, посылаемое потоком, но как только в процедуре обработки

сообщения лезешь к Визуальным компанентам, получается AV. Как оформить обращение к визуальным компанентам внутри класса

главной формы, что бы избежать AV.

КОД обработчика сообщения

Код

procedure TForm1.MyHook(var Mes:TMessage);
begin
  Button1.Enabled:=False; //Вот тут и возникает AV
end;


Конечно можно сделать вот так

Код

procedure TForm1.MyHook(var Mes:TMessage);
begin
  Form1.Button1.Enabled:=False; //Вот тут и возникает AV
end;

Но некрасиво как-то, да и обращаясь к Form1 уже выходим за класс к другим переменным.

Это сообщение отредактировал(а) Alex - 26.5.2005, 18:38
PM MAIL   Вверх
Snowy
Дата 26.5.2005, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Нормальный код. Все должно работать.
Разве, что в момент получения сообщения батон не существует.
Мессадж на другой менять не пробовал?
Может он у тебя совпадает с каким-нить системным...
PM MAIL   Вверх
zalex
Дата 26.5.2005, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Мессаж - WM_User+13. Менять пробовал, но это всё равно как по колёсам стучать и стекла протирать.
Баттон в Дизайн-тайме создан.

Если никто не против полностью исходник выложить могу.
PM MAIL   Вверх
Snowy
Дата 26.5.2005, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(zalex @ 26.5.2005, 17:16)
WM_User+13. Менять пробовал, но это всё равно как по колёсам стучать и стекла протирать.

В данном случае да.

Цитата(zalex @ 26.5.2005, 17:16)
Если никто не против полностью исходник выложить могу.

Если меньше 64 строк, то давай.
Если польше, то приаттач в архиве к сообщению.
PM MAIL   Вверх
zalex
Дата 26.5.2005, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Unit2, ExtCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private declarations }
  public
  procedure MyHook(var Mes:TMessage);Message WM_User+13;stdcall;

    { Public declarations }
  end;

var
  Form1: TForm1;
    MT:  TMathThread;
implementation

{$R *.dfm}
procedure TForm1.MyHook(var Mes:TMessage);
begin
Button1.Enabled:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled:=False;
MT:=TMathThread.Create(True);
MT.Priority:=TPLowest;
MT.MainHandle:=Self.Handle;
MT.FreeOnTerminate:=True;
Mt.Resume;
end;

end.

Это главный модуль. Он использует Unit 2
unit Unit2;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TMathThread = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  public

  MainHandle:HWND;
  MyReal:Real;
end;

implementation

Function MyMath(a,b:real):real;
begin
Result:=a/b;
end;

procedure TMathThread.Execute;
var x,y:real;
i:integer;
begin
try

for i:=0 to 500 do
begin
x:=1;
y:=i;
Myreal:=MyMath(x,y);
end;

except
SendMessage(MainHandle,WM_User+13,1,1);
end;

end;
end.


Это сообщение отредактировал(а) Alex - 26.5.2005, 18:39
PM MAIL   Вверх
Illusion Dolphin
Дата 26.5.2005, 18:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Код

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Unit2, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);

private
{ Private declarations }
public
procedure MyVisualMethod;

{ Public declarations }
end;

var
Form1: TForm1;
MT: TMathThread;
implementation

{$R *.dfm}
procedure TForm1.MyVisualMethod;
begin
Button1.Enabled:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled:=False;
MT:=TMathThread.Create(True);
MT.Priority:=TPLowest;
MT.MainHandle:=Self.Handle;
MT.FreeOnTerminate:=True;
Mt.Resume;
end;

end.

Это главный модуль. Он использует Unit 2
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TMathThread = class(TThread)
private
procedure DoMyVisualMethod;
{ Private declarations }
protected
procedure Execute; override;
public

MainHandle:HWND;
MyReal:Real;
end;

implementation

procedure TMathThread.DoMyVisualMethod;
begin
Form1.MyVisualMethod;
end;

Function MyMath(a,b:real):real;
begin
Result:=a/b;
end;

procedure TMathThread.Execute;
var x,y:real;
i:integer;
begin
try

for i:=0 to 500 do
begin
x:=1;
y:=i;
Myreal:=MyMath(x,y);
end;

except
Synchronize(DoMyVisualMethod); //!!!!
end;

end;
end.


и никаких сообщений и AV


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
zalex
Дата 26.5.2005, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Согласен, но для меня важно, что бы поток ничего не знал кроме HWND главной формы. Решаю задачу, пытаюсь структурировать на более мелкие, но ничего не получается.

Проще, как уже писал в первом письме, сделать
Form1.Button1.Enabled:=False вместо Button1.Enabled:=False, но некрасиво это, хотелось бы всё решить на уровне класса и не вылазить за его пределы.(Как в случае с переменной Form1)


Может это выглядит и загонно, но хочется как бы сказать - юнитности. Т.е. отладил объект - забыл про него, и т.д. Вот и поток хочу что бы выдавал что либо, зная лишь HWND формы, причем реакция формы позволяла бы лезть к VCL-компаненту.

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

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

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

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

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


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

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


 




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


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

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