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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2011, 15:30   #1
vsrmis
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 26
По умолчанию посылка сообщений между экземплярами классов.

Free Pascal , Lasarus;

Нужно чтоб екземпляры классов могли посылать другу другу сообщения(Сигналы).

Причём не ждать ответа а продолжать выполнение кода тоесть гдето так

//работает код
SendSignal(UserList[i],'строка или более сложная конструкция');
// снова работает код не дожидаясь ответа

В этоже время у этого самого UserList[i] должен вызватся метод
getSignal(User:TUser;Signa:'строка или более сложная конструкция');

раньше вызывал на прямую getSignal
но пока эта getSignal не закончит работу Код вызвавший её выполнятся не будет.

Как орказизовать такую посылку сообщений.
(Должно быть кросплатформенно)
vsrmis вне форума Ответить с цитированием
Старый 01.08.2011, 15:45   #2
vsrmis
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 26
По умолчанию

Думаю сделать через потоки.

Вот пытаюсь реализовать упрощённый пример, который не хочет работать.
Код:
 TUser = class(TThread)
  FM:string;
  cs: TRTLCriticalSection;
  Inbox:string;
  FFriend:TUser;
  FMemo:TMemo;
  procedure UpDateMemo;
  procedure SendMesege(User:TUser;M:string);
  procedure GetMesege(User:TUser;M:string);

   constructor Create(Friend:TUser;memo:TMemo);
   procedure Execute; override;
 end;

procedure TUser.UpDateMemo;
begin
  Form1.Memo1.Append(Inbox);
end;

procedure TUser.SendMesege(User: TUser; M: string);
begin
   EnterCriticalsection(cs);
   User.GetMesege(self,M);
   LeaveCriticalsection(cs);
end;

procedure TUser.GetMesege(User: TUser; M: string);
var i:Integer;
begin
   EnterCriticalsection(cs);
   Inbox:=M;
   Synchronize(@UpDateMemo);
   LeaveCriticalsection(cs);
end;

constructor TUser.Create(Friend:TUser;memo:TMemo);
begin
    FFriend:=Friend;
    Fmemo :=memo;
    Inbox := 'some text';
    M:= 'some text';
end;

procedure TUser.Execute;
var
i:Integer;
begin

  for i:=0  to 10000 do begin
      SendMesege(FFriend,Fm);
  end;
 //inherited Execute;
end;
Вылетает вообще на смешном Inbox:= M;
vsrmis вне форума Ответить с цитированием
Старый 01.08.2011, 16:16   #3
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

cs не создали, не говоря уже про вызов inherited Create().
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 01.08.2011, 16:39   #4
vsrmis
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 26
По умолчанию

А если серьёздно? Create не существует в преведущем, а cs это Запись.
ввёл функцию InitCriticalSection(cs); результата - 0;
vsrmis вне форума Ответить с цитированием
Старый 01.08.2011, 17:32   #5
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Create не существует в преведущем
Каком таком "преведущем" ?
Может все же у предка ?
У предка он есть и вызов его крайне важен. Как крайне важен собственно и вызов конструктора твоего класса TUser, прежде чем обращаться к объекту этого класса.
А у тебя ни того ни другого в коде не наблюдается. Потому и грабли)
mss вне форума Ответить с цитированием
Старый 01.08.2011, 17:34   #6
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

кр.того с какого перепугу методы TUser.Create и TUser.Execute стали опубликованными ?

Execute был, есть и будет защищенным, а Create - публичным.
Ныне, присно и во веки веков)
mss вне форума Ответить с цитированием
Старый 01.08.2011, 18:25   #7
vsrmis
Пользователь
 
Регистрация: 09.12.2010
Сообщений: 26
По умолчанию

Изменил, проще кажется уже ну совсем некуда. Вылетает при Create. В чём ошибка?
TSimpleThread= class(TThread)
protected
procedure Execute; override;
public
end;

procedure TSimpleThread.Execute;
begin

end;

procedure TForm1.FormCreate(Sender: TObject);

begin
Some:=TSimpleThread.Create(False);
end;
vsrmis вне форума Ответить с цитированием
Старый 01.08.2011, 20:38   #8
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> Вылетает при Create

Каким курсом ?
mss вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
спонтанная ошибка при синхронизации потока Thread и основного приложения(Посылка сообщений) Человек_Борща Общие вопросы Delphi 2 14.05.2011 22:25
Сбор сообщений службы сообщений Windows XP testor48 Работа с сетью в Delphi 3 31.03.2011 20:20
Посылка пользовательских сообщений в чужое приложение RFbager Win Api 8 11.01.2011 20:51
Создание классов и использование объектов классов при написании программ в среде C++. Frozen inside Помощь студентам 0 16.04.2009 23:18
Посылка сообщений Windows другой программе shurik_7866 Win Api 1 23.10.2008 16:25