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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2008, 08:43   #1
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
Вопрос В чем отличия двух способов? (потоки и таймеры))

Господа, я с глупым вопросом.
В чем отличия работы таймера и потока в цикле которого есть засыпалка на столько же секунд что и у таймера?

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var        thra:Cardinal;
  Form1: TForm1;

implementation

{$R *.dfm}
 function tf(h:hwnd;i,e:integer;d:dword):integer;
 begin
  Form1.Label1.Caption:=TimeToStr(time);
 end;


 function thr():dword ;
 begin
  while true do begin
   Form1.Label2.Caption:=TimeToStr(time);
   sleep(1000);
  end
 end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetTimer(Handle,1,1000,@tf);
CreateThread(0,0,@thr,nil,CREATE_NEW,thra);
end;

end.
В каких случаях какой способ предпочтительнее?

Вот даже пример приведу: На сервак хочу поставить прогу которая следит за подключениями, получает список файлов удаленно открытых (а точнее тех которые удаленно сохраняются на сервак) и если расширение этого файла скажем AVI то рубит подключение. Что предпочтительнее в данном случае?

Кстати как бы вы реализовали такую задачу и не повредит ли обрабывание подключения во время записи файла на комп самому компу (т.е. фаловой системе. винде...)?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2008, 10:42   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

в лучае с потоком нужна ещё и синхронизация! в данном случае может и не нужна, но при написании более сложных вещей, нужна. И по-моему, лучше всего использовать таймер, так как в случае с потоком будет создан люъект ядра поток, будет выделена память под его стек и много другого.
В твоей задаче я бы тоже использовал таймер (хотя может есть и другие способы).

Последний раз редактировалось rpy3uH; 30.07.2008 в 10:46.
rpy3uH вне форума Ответить с цитированием
Старый 30.07.2008, 11:03   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
В твоей задаче я бы тоже использовал таймер
Принято к сведенью.
Цитата:
хотя может есть и другие способы
Драйвер писать не хоцца )))
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2008, 23:11   #4
DearHunter
Пользователь
 
Регистрация: 30.07.2008
Сообщений: 14
По умолчанию

Отличия в том, что в случае использования таймера, система отправляет указанному в вызове хендлу сообщения WM_TIMER через указанную паузу. То есть, в данном примере требуется добавить обработчик такого сообщения. Такой подход позволяет реализовать неблокирующее ожидание, то есть, дожидаясь события таймера, поток может заниматься другой полезной работой.
В случае использования Sleep(), поток, из которого делается вызов, приостанавливается системой на указанный интервал. Это значит, что никакой пользы он в это время не приносит. А если это главный поток приложения (дельфи), то и отрисовки интерфейса в это время не происходит. Тем не менее, это самый простой способ обеспечить паузу.
Для решения Вашей задачи больше подходит вариант с таймером, хотя действительно, больше смысла в ожидании обновления файловой системы с помощью FindFirstChangeNotification.
DearHunter вне форума Ответить с цитированием
Старый 31.07.2008, 02:05   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Кстати как бы вы реализовали такую задачу и не повредит ли обрабывание подключения во время записи файла на комп самому компу (т.е. фаловой системе. винде...)?
Если это ключевая фраза, то, однозначно, перехват NtCreateFile. "Сверху" или "снизу" - уже детали.
B_N вне форума Ответить с цитированием
Старый 31.07.2008, 08:40   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Отличия в том, что в случае использования таймера, система отправляет указанному в вызове хендлу сообщения WM_TIMER через указанную паузу. То есть, в данном примере требуется добавить обработчик такого сообщения.
Давай ка ты пример мой потестиши и внимательно про эту функцию почитаешь в MSDN.
Цитата:
А если это главный поток приложения (дельфи), то и отрисовки интерфейса в это время не происходит
Как бы это сказать... Я в принципе главный поток не трогал, создав дополнительный.
Цитата:
хотя действительно, больше смысла в ожидании обновления файловой системы с помощью FindFirstChangeNotification.
Это wrong опробованный вариант, я не смогу контролировать сразу около 50 подключений, это грузит сервак донельзя.
Цитата:
B_N
Ых... Вот ну никак не хотелось бы этого...
Я понимаю что это найприемлемое, будь сервак на Линухе давно бы уже переподправил ядро, но это винда... ну никак не хоцца ее портить...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.07.2008, 13:56   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Это wrong опробованный вариант, я не смогу контролировать сразу около 50 подключений, это грузит сервак донельзя.
???????

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ых... Вот ну никак не хотелось бы этого...
Я понимаю что это найприемлемое, будь сервак на Линухе давно бы уже переподправил ядро, но это винда... ну никак не хоцца ее портить...
Почему это "портить"? Вполне нормальный и вполне законный способ перехвата системных сервисов. Можно сказать, обычная практика многих программ. И уж точно проще, чем пересобирать пингвинное ядро. Есть даже "классический" пример, кстати как раз на NtCreateFile: http://www.windowsitlibrary.com/Content/356/06/2.html .
B_N вне форума Ответить с цитированием
Старый 31.07.2008, 14:03   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Есть даже "классический" пример, кстати как раз на NtCreateFile
Ух... Спасибо, посмотримс..
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.07.2008, 14:08   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ух... Спасибо, посмотримс..
Stilet, если нужно, вечерком покопаюсь, у меня где-то были исходники к этой книжке, на сайте код с некоторыми сокращениями + в исходниках кое-что лишнее.
B_N вне форума Ответить с цитированием
Старый 31.07.2008, 14:16   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да в принципе не надо, этой статейки хватит...
Кстати было б просто идеально достать где-то фаервол позволяющий контролировать запись файлов на комп...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Отличия Windows и Linux Altera Операционные системы общие вопросы 5 08.07.2008 20:27
обновление в блоге - 11 способов вставить цитату на сайт Pblog Обсуждение статей 0 07.02.2008 21:30
Использование различных способов организации данных tosnopunker Паскаль, Turbo Pascal, PascalABC.NET 1 23.12.2007 15:31