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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.07.2011, 18:53   #1
derElektroBesen
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 24
Печаль Работа с Handle

Работаю над проектом. Хочу через ф-ию SendMessage(...) скинуть сообщение потоковому классу. Дабы это сделать, передаю из вне в конструктор первого класса хэндл второго.
Код:
{<TimerUnit>}

const
  SX_TIMERMESSAGE = WM_USER + 1;

TArrayOfTHandle = array of THandle;
...
type
TTimerThread = class (TThread)
  protected
    ...
    Handles: TArrayOfTHandle;
    procedure Execute; override;
    procedure OnTimer;
  public
    constructor Create(const H: TArrayOfTHandle;
      const aInterval: Cardinal = 1000);
  end;
...
constructor TTimerThread.Create(const H: TArrayOfTHandle;
  const aInterval: Cardinal = 1000);
begin
  ...
  Handles := H;
  inherited Create(False);
end;

procedure TTimerThread.OnTimer;
var
  I: Integer;
begin
  for I := 0 to High(Handles) do
    SendMessage(Handles[I], SX_TIMERMESSAGE, 1, 0);
end;
...
...
...
{<MainUnit>}

procedure TForm1.FormShow(Sender: TObject);
begin
  Enemy := TEnemy.Create(...);
  SetLength(Handles, 1);
  Handles[0] := Enemy.Handle;
  Timer := TTimerThread.Create(Handles, 10);
end;
...
...
...
{<EnemyUnit>}

TEnemy = class (TThread)
  protected
    ...
    procedure Execute; override;
    procedure SXReadTimerMessage(var Mes: TMessage); message SX_TIMERMESSAGE;
    procedure Paint; virtual;
    procedure MoveEnemy; virtual;
    ...
  end;
...
procedure TEnemy.Execute;
begin
  repeat
    Sleep(10); // Дабы не вызывалось слишком часто
    Synchronize(Paint);
  until Terminated;
end;

procedure TEnemy.SXReadTimerMessage(var Mes: TMessage);
begin
  MoveEnemy;
end;

procedure TEnemy.MoveEnemy;
begin
  ...
end;
Так вот. Несмотря на сообщение SX_TIMERMESSAGE, процедура SXReadTimerMessage так ни разу и не вызывается...
Проблема видимо в том, что я неверно беду Handle объекта типа TEnemy.
Но я не вижу решения в связи с тем, что сталкиваюсь с подобным впервые. Буду рад помощи
derElektroBesen вне форума Ответить с цитированием
Старый 17.07.2011, 22:45   #2
derElektroBesen
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 24
По умолчанию

И ни у кого нету ни единой идеи?..
Здесь же программисты вокруг =)
По идее)))
derElektroBesen вне форума Ответить с цитированием
Старый 17.07.2011, 22:52   #3
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от derElektroBesen Посмотреть сообщение
И ни у кого нету ни единой идеи?..
Здесь же программисты вокруг =)
По идее)))
в чужом коде разбираться влом, а зачем через sendmessage передавать ?
что это чтука вообще делает?
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 17.07.2011, 22:58   #4
derElektroBesen
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 24
По умолчанию

Потому что для таймера создан отдельный поток. В случае если использовать обычный таймер, в главном потоке, то при, предположим, зацикливании чего бы то ни было на формачке, таймер тоже обламывается. То же самое происходит если использовать Form1.Handle.
Поэтому я генерирую свое сообщение из одного потока и хочу кинуть во все объекты различных классов (соответственно различных потоков. У меня один класс - один поток). Чтобы передать Handle каждого объекта заюзан массив Handles который передается таймеру в конструктор.
derElektroBesen вне форума Ответить с цитированием
Старый 17.07.2011, 23:05   #5
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от derElektroBesen Посмотреть сообщение
Потому что для таймера создан отдельный поток. В случае если использовать обычный таймер, в главном потоке, то при, предположим, зацикливании чего бы то ни было на формачке, таймер тоже обламывается. То же самое происходит если использовать Form1.Handle.
Поэтому я генерирую свое сообщение из одного потока и хочу кинуть во все объекты различных классов (соответственно различных потоков. У меня один класс - один поток). Чтобы передать Handle каждого объекта заюзан массив Handles который передается таймеру в конструктор.
а что за задача такая что зависает?

если долго чтот работает обычно кидаю
application.processmessage; в тело цикла и вроде все работало ...
чую прога - которая память сканирует на предмет каких та цифр...
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype

Последний раз редактировалось denisbrain; 17.07.2011 в 23:10.
denisbrain вне форума Ответить с цитированием
Старый 17.07.2011, 23:09   #6
derElektroBesen
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 24
По умолчанию

Вполне нормальная)))
Предположим основному потоку необходимо просчитать для каждого I от 1 до миллиона некоторую формулу. Или там прочесть файл с данными, файл имеет большой объем, и тд и тп, но при этом с использованием доп потоков мы добиваемся "независания" программы в целом. Предположим можно прописывать количество записей, которое обработано или использовать какой нибудь bar для отображения процента завершенности...
derElektroBesen вне форума Ответить с цитированием
Старый 17.07.2011, 23:11   #7
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

Цитата:
Сообщение от derElektroBesen Посмотреть сообщение
Вполне нормальная)))
Предположим основному потоку необходимо просчитать для каждого I от 1 до миллиона некоторую формулу. Или там прочесть файл с данными, файл имеет большой объем, и тд и тп, но при этом с использованием доп потоков мы добиваемся "независания" программы в целом. Предположим можно прописывать количество записей, которое обработано или использовать какой нибудь bar для отображения процента завершенности...
а на несколько ехе шников задачу разбить не получается?
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 17.07.2011, 23:17   #8
derElektroBesen
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 24
По умолчанию

Парень! Задача абсолютно вменяемая! Или ты считаешь, что все программы работают на одном потоке?! Если бы это было действительно так, я думаю ты (Вы) бы повесился еще до изобретения фотошопа! Так что попрошу без сарказма!

Последний раз редактировалось derElektroBesen; 17.07.2011 в 23:17. Причина: Очепятка
derElektroBesen вне форума Ответить с цитированием
Старый 17.07.2011, 23:17   #9
denisbrain
Форумчанин
 
Регистрация: 29.05.2011
Сообщений: 449
По умолчанию

procedure mymessga() message SX_TIMERMESSAGE;
задания на pascal/delphi ICQ 368254335
Tel +79177425326 mail denis-naymov1985(at)mail.ru login skype denis.new.skype
denisbrain вне форума Ответить с цитированием
Старый 17.07.2011, 23:18   #10
derElektroBesen
Пользователь
 
Регистрация: 17.07.2011
Сообщений: 24
По умолчанию

И чего? =)
-----------
Правите Вы уже после поступления ответа))) Теряется смысл)
ProcessMessages тоже не совсем подходит... Мне именно необходима многопоточность, в целях изучения этого довольно интересного раздела...
-----------
Опять же дитя позднего редактирования сообщений:
Цитата:
Сообщение от denisbrain Посмотреть сообщение
что это чтука вообще делает?
Не важно
Все что Вам может понадобиться для понятия сути проблемы, лежит в теме. См выше.

Последний раз редактировалось derElektroBesen; 17.07.2011 в 23:52.
derElektroBesen вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с HANDLE из разных потоков sluge Win Api 6 24.01.2011 10:07
HANDLE в С++ genikoff Общие вопросы C/C++ 1 12.05.2010 15:03
Как узнать handle окна имея handle обного из его компонентов SeRhy Win Api 2 18.10.2009 19:31
Как имея handle окна узнать handle edit-a который находится в етом окне SeRhy Общие вопросы Delphi 1 20.07.2008 13:48
Handle -=<[Evklidd]>=- Общие вопросы Delphi 5 03.03.2008 09:02