Как работать с потоками?

marinius
Дата: 30.11.2007 12:44:22
Здравствуйте. Имеется программа части, которой я находила на форуме и поправляла под свои нужды, каждую часть тестировала в отдельности - до сих пор успешно. Теперь подошло дело к концу и мне нужно объеденить все части, но вот незадача, не знаю как запустить поток? Фрагмент кода:
TMyThread = class(TThread)
  private
  protected
    NewTimer:TTimer;
  Procedure Execute; override;
  Procedure StartProcess(Sender:TObject);
  end;

procedure TMyThread.Execute;
begin
    NewTimer:=TTimer.Create(Application);
    NewTimer.Enabled := false;
    NewTimer.OnTimer := StartProcess;
    NewTimer.Interval:= 600000;//10 минут
    NewTimer.Enabled := True;
end;

Procedure TMyThread.StartProcess(Sender:TObject);
var
  i:Cardinal; {код завершения процесса, если 0, то успешно завершон, иначе с ошибкой}
  Cmd:AnsiString; {Какая команда запускается}
  atStroka:String; {содержит at команду и длину pdu - строки}
  pduStroka:String; {Строка сформированная для посыла на COM порт}
  Stroka:String;
begin
  if form1.Edit1.Text='' then begin ShowMessage('Введите команду!'); exit; end
  else Cmd:= form1.Edit1.Text;
  ExecConsoleApp(Cmd,i); {процедура, запускающая консольный процесс}
  if  i<>0 then {Если процесс завершился с ошибкой}
  begin
    smsStrings(cmd, atStroka, pduStroka); //процедура формирует 2 строки для отправки sms
    try
      Stroka := atStroka+#13+#10;
      PortInit;                                      //процедура инициализации COM порта
      WriteComm(Stroka);                      //процедура записи в порт
      Sleep(1000);//Задержка, чтобы телефон успел ответить
      ReadComm;                                 //процедура чтения с COM порта
      Stroka := pduStroka+#26;
      WriteComm(Stroka);
      FlushFileBuffers(CommHandle);
    finally
    end;
    KillComm;                                    //процедура закрывает порт
  end;
end;

Идея такая: посылаю несколько команд (допустим ping), и для каждой команды создаётся свой таймер (срабатывающей, допустим каждые 10 минут) и свой поток, в котором эта команда обрабатывается и, если неуспешно, то отправляю sms.
Вроде бы реализация запуска процесса и таймера в потоке есть, а как сделать, чтобы каждую команду я посылала, например, по нажатию кнопки, а дальше всё тоже самое: поток->таймер->процесс. А то я не пойму как инициализировать поток или он при загрузке программы сразу начинает срабатывать, вобщем в этом месте не пойму?
Dimitry Sibiryakov
Дата: 30.11.2007 12:55:59

marinius

Имеется программа части, которой я находила на форуме и поправляла под
свои нужды

А теперь таки пойдите и почитайте Рихтера. Таймеры и потоки - две вещи
несовместные (с вашим уровнем знаний).

Posted via ActualForum NNTP Server 1.4

marinius
Дата: 30.11.2007 12:59:40
Dimitry Sibiryakov

marinius

Имеется программа части, которой я находила на форуме и поправляла под
свои нужды

А теперь таки пойдите и почитайте Рихтера. Таймеры и потоки - две вещи
несовместные (с вашим уровнем знаний).
Posted via ActualForum NNTP Server 1.4


Идея взята отсюда, на этом же форуме и как я поняла работает:
http://sql.ru/forum/actualthread.aspx?tid=147645&hl=ttimer
Dimitry Sibiryakov
Дата: 30.11.2007 13:04:16

marinius
и как я поняла работает:

Это заключение Вы построили на фразе
Samir
как сделать чтоб таймер работал в потоке?

???

Posted via ActualForum NNTP Server 1.4

marinius
Дата: 30.11.2007 13:16:49
Dimitry Sibiryakov

marinius
и как я поняла работает:

Это заключение Вы построили на фразе
Samir
как сделать чтоб таймер работал в потоке?

???
Posted via ActualForum NNTP Server 1.4


Это вы уже к словам цепляетесь: "какие выводы я сделала", может выражаюсь неправильно, но из примера и комментариев следует следующее, что я хочу...

- кликаю на кнопку первый раз -> берётся команда_1 из edit1->создаётся процесс1,таймер1, который следит за повтором именно этой команды и т.д.

- кликаю на кнопку второй раз -> берётся команда_2 из edit1->создаётся процесс2,таймер2, который следит за повтором именно этой команды_2 и т.д.
...
Ну и так раз 10
Anatoly Podgoretsky
Дата: 30.11.2007 13:21:26
А таймер то зачем?
Dimitry Sibiryakov
Дата: 30.11.2007 13:21:53

marinius
что я хочу...

Выкиньте таймер. Код засуньте непосредственно в Execute.
На каждый клик порождайте по потоку (если это то, что нужно).
Забудьте про любое взаимодействие с пользователем в потоке и конкретно
про переменную form1.

Posted via ActualForum NNTP Server 1.4

marinius
Дата: 30.11.2007 13:26:15
А может не надо никаких потоков просто сделать:
Button.Click
...
begin
NewTimer:=TTimer.Create;
...
StartProcess();
end;

?
marinius
Дата: 30.11.2007 13:27:46
Anatoly Podgoretsky
А таймер то зачем?

...чтобы запускать эту команду каждые 10 минут
marinius
Дата: 30.11.2007 13:37:16
Dimitry Sibiryakov

Выкиньте таймер. Код засуньте непосредственно в Execute.
На каждый клик порождайте по потоку (если это то, что нужно).
Забудьте про любое взаимодействие с пользователем в потоке и конкретно
про переменную form1.
Posted via ActualForum NNTP Server 1.4


Нет таймер вот зачем:
- на кнопку 1 раз нажала, и эта команда крутиться....
- второй раз запускаю уже другую команду, но и она крутиться также (т.е. происходят те же самые действия, что и с 1-ой)
...

ухожу с работы, допустим на сутки, оставляю эти 10 команд крутится, как только одна из них не сработала timer.enabled:=false (для соответствующей команды) и я в курсе, какой сервер не пингуется