[РЕШЕНО] TProcess - 2 запуска вместо 1го

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

[РЕШЕНО] TProcess - 2 запуска вместо 1го

Сообщение pztrn » 18.07.2010 08:01:08

Пишу небольшую программку для облегчения жизни геймерам-линуксоидам. Суть программы вот в чем: запускается процесс ioUrbanTerror.ARCH, путь до которого хранится в BINARYPATH (TEdit). К нему, в зависимости от выбранных параметров, добавляются такие опции, как запуск mumble-overlay, или же запуск во второй X сессии. Вот кусок кода:

Код: Выделить всё
procedure TForm1.LAUNCHURTClick(Sender: TObject);
begin
     if  (MUMBLEOVERLAYCHECKBOX.Checked = False and SECONDXCHECKBOX.Checked = False) then
     begin
          cmdopts := ' +name ' + NICK.Text + ' +connect ' + IPADDRESS.Text;
          cmdopts1 := ' +password ' + PWFIELD.Text;
          AProcess := TProcess.Create(nil);
          AProcess.CommandLine := BINARYPATH.Text + cmdopts + cmdopts1;
          AProcess.Execute;
     end;
     if  (SECONDXCHECKBOX.Checked = True and MUMBLEOVERLAYCHECKBOX.Checked = False) then
     begin
          cmdopts := ' +name ' + NICK.Text + ' +connect ' + IPADDRESS.Text;
          cmdopts1 := ' +password ' + PWFIELD.Text;
          AProcess := TProcess.Create(nil);
          AProcess.CommandLine := 'xinit ' + BINARYPATH.Text + cmdopts + cmdopts1 + ' -- :1';
          AProcess.Execute;
     end;
     if  (SECONDXCHECKBOX.Checked = False and MUMBLEOVERLAYCHECKBOX.Checked = True) then
     begin
          cmdopts := ' +name ' + NICK.Text + ' +connect ' + IPADDRESS.Text;
          cmdopts1 := ' +password ' + PWFIELD.Text;
          AProcess := TProcess.Create(nil);
          AProcess.CommandLine := '/usr/bin/mumble-overlay ' + BINARYPATH.Text + cmdopts + cmdopts1;
          AProcess.Execute;
     end;
     if  (SECONDXCHECKBOX.Checked = True and MUMBLEOVERLAYCHECKBOX.Checked = True) then
     begin
          cmdopts := ' +name ' + NICK.Text + ' +connect ' + IPADDRESS.Text;
          cmdopts1 := ' +password ' + PWFIELD.Text;
          AProcess := TProcess.Create(nil);
          AProcess.CommandLine := 'xinit /usr/bin/mumble-overlay ' + BINARYPATH.Text + cmdopts + cmdopts1 + ' -- :1';
          AProcess.Execute;
     end;
end;

Опции TProcess - poWaitOnExit

Проблема в следующем - ioUrbanTerror запускается не только во вторых иксах (если соответствующая галочка чекнута), но и в первых. Соответственно, получаем лаги, и процесс, запущенный в первых иксах, приходится убивать из tty. Вопрос - как это исправить?

Я еще новичок, не пинайте, если что не так :<
Последний раз редактировалось pztrn 18.07.2010 17:08:55, всего редактировалось 1 раз.
pztrn
незнакомец
 
Сообщения: 9
Зарегистрирован: 18.07.2010 07:48:52

Re: TProcess - 2 запуска вместо 1го

Сообщение Odyssey » 18.07.2010 16:46:30

Навскидку похоже что проблема в проверках. Я бы заменил
Код: Выделить всё
if  (MUMBLEOVERLAYCHECKBOX.Checked = False and SECONDXCHECKBOX.Checked = False) then
// на
if  (MUMBLEOVERLAYCHECKBOX.Checked = False) and (SECONDXCHECKBOX.Checked = False) then
И со остальными проверками то же самое.

А вообще тут очень много дублирующегося кода. Можно переписать например так:
Код: Выделить всё
procedure TForm1.LAUNCHURTClick(Sender: TObject);
var
  Process: TProcess;
  cmdopts: string;
begin
     cmdopts := BINARYPATH.Text + ' +name ' + NICK.Text + ' +connect ' + IPADDRESS.Text + ' +password ' + PWFIELD.Text;
     Process := TProcess.Create(nil);
     if MUMBLEOVERLAYCHECKBOX.Checked then // mumble
     begin
         if SECONDXCHECKBOX.Checked then
             Process.CommandLine := 'xinit /usr/bin/mumble-overlay ' + cmdopts + ' -- :1'
         else
             Process.CommandLine := '/usr/bin/mumble-overlay ' + cmdopts;
     end else
     begin // no mumble
         if SECONDXCHECKBOX.Checked then
             Process.CommandLine := 'xinit ' + cmdopts + ' -- :1'
         else
             Process.CommandLine := cmdopts;
     end;     
     Process.Execute;
     FreeAndNil(Process);
end;
или вообще так:
Код: Выделить всё
procedure TForm1.LAUNCHURTClick(Sender: TObject);
var
  Process: TProcess;
begin
  Process := TProcess.Create(nil);
  try
    Process.CommandLine := Format('%s +name %s +connect %s +password %s', [BINARYPATH.Text, NICK.Text, IPADDRESS.Text, PWFIELD.Text]);
    if MUMBLEOVERLAYCHECKBOX.Checked then
      Process.CommandLine := Format('/usr/bin/mumble-overlay %s', [Process.CommandLine]);
    if SECONDXCHECKBOX.Checked then
      Process.CommandLine := Format('xinit %s -- :1', [Process.CommandLine]);
    Process.Execute;
  finally
    FreeAndNil(Process);
  end;
end;
Не сочтите за пинки, пишите как хотите. Просто последний вариант -- для самых ленивых. И не забудьте освободить процесс ;)
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: TProcess - 2 запуска вместо 1го

Сообщение Maxizar » 18.07.2010 16:54:05

Вы не правильно делаете вот тут : if (MUMBLEOVERLAYCHECKBOX.Checked = False and SECONDXCHECKBOX.Checked = False) then, правильно нуна делать так :
if (MUMBLEOVERLAYCHECKBOX.Checked = False) and (SECONDXCHECKBOX.Checked = False) then, (см внимательнее скобки) почему так да потому что при логических сравнениях идет работа с крайними переменными если их больше 2х ставим скобки (приоритет).
Maxizar
постоялец
 
Сообщения: 385
Зарегистрирован: 20.03.2010 19:48:14

Re: TProcess - 2 запуска вместо 1го

Сообщение pztrn » 18.07.2010 17:08:40

Спасибо большое, помогло :> Вот что получилось у меня:

Код: Выделить всё
procedure TForm1.LAUNCHURTClick(Sender: TObject);
begin
     cmdopts := ' +name ' + NICK.Text + ' +connect ' + IPADDRESS.Text;
     cmdopts1 := ' +password ' + PWFIELD.Text;
     Xoverlay := 'xinit /usr/bin/mumble-overlay ';
     if  (SECONDXCHECKBOX.Checked = False) and (MUMBLEOVERLAYCHECKBOX.Checked = False) then
     begin
          AProcess := TProcess.Create(nil);
          AProcess.CommandLine := BINARYPATH.Text + cmdopts + cmdopts1;
          AProcess.Execute;
     end;
     if  (SECONDXCHECKBOX.Checked = True) and (MUMBLEOVERLAYCHECKBOX.Checked = False) then
     begin
          AProcess := TProcess.Create(nil);
          AProcess.CommandLine := 'xinit ' + BINARYPATH.Text + cmdopts + cmdopts1 + ' -- :1';
          AProcess.Execute;
     end;
     if  (SECONDXCHECKBOX.Checked = False) and (MUMBLEOVERLAYCHECKBOX.Checked = True) then
     begin
          AProcess := TProcess.Create(nil);
          AProcess.CommandLine := '/usr/bin/mumble-overlay ' + BINARYPATH.Text + cmdopts + cmdopts1;
          AProcess.Execute;
     end;
     if  (SECONDXCHECKBOX.Checked = True) and (MUMBLEOVERLAYCHECKBOX.Checked = True) then
     begin
          AProcess := TProcess.Create(nil);
          AProcess.CommandLine := Xoverlay + BINARYPATH.Text + cmdopts + cmdopts1 + ' -- :1';
          AProcess.Execute;
     end;
end;
pztrn
незнакомец
 
Сообщения: 9
Зарегистрирован: 18.07.2010 07:48:52


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 46

Рейтинг@Mail.ru