Приложение с графическим интерфейсом перестает отвечать на запросы во время выполнения http-запроса

Я только что сделал свое первое правильное небольшое настольное приложение с графическим интерфейсом, которое в основном обертывает интерфейс графического интерфейса (php-gtk) вокруг случая веб-тестирования SimpleTest, чтобы заставить его действовать как клиент удаленного тестирования.

Каждый раз, когда запускается локальный кейс The Web Test, он отправляет HTTP-запрос к другому кейсу SimpleTest (с интерфейсом XHTML), находящемуся на моем сервере.

Приложение позволяет мне запустить один локальный тест, который сопоставляет информацию из нескольких удаленных тестов. У него просто есть кнопка «Начать тест», кнопка «Остановить тест» и настройка для увеличения/уменьшения количества удаленных тестов, проводимых в каждом HTTP-запросе. Каждый тестовый запуск занимает около часа.

Проблема в том, что большую часть времени приложение делает HTTP-запросы. Кроме того, всякий раз, когда выполняется HTTP-запрос, графический интерфейс приложения не отвечает.

Я заставил приложение ждать несколько секунд (повторяя Gtk::main_iteration ) между запросами, чтобы дать пользователю время изменить размер окна, нажать кнопку «Стоп» и т. д. Но это делает весь тест бег занимает намного больше времени, чем необходимо.

<?php
require_once('simpletest/web_tester.php');

class TestRemoteTestingClient extends WebTestCase
 {

 function testRunIterations()
  {
  ...
  $this->assertTrue($this->get($nextUrl), 'getting from pointer:'. $this->_remoteMementoPointer);
  $this->assertResponse(200, "checking response for " . $nextUrl );
  $this->assertText('RemoteNodeGreen');
  $this->doGtkIterationsForMinNSeconds($secs);
  ...
  }

 public function doGtkIterationsForMinNSeconds($secs)
  {
  $this->appendStatusMessage("Waiting " . $secs);
  $start = time();
  $end = $start + $secs;

  while( (time()  < $end) )
   {
   $this->appendStatusMessage("Waiting " . ($end - time()));
   while(gtk::events_pending()) Gtk::main_iteration();
   }
  }
 }

Есть ли способ, чтобы приложение отвечало, в то же время делая HTTP-запрос?

Я рассматриваю возможность разделения приложения на два, где:

  • Приложение Test Controller — действует как средство записи настроек/чтения отчетов, записывает в файл настроек и читает файл отчета.
  • Приложение Test Runner — действует как средство чтения настроек/записи отчетов и для каждой итерации считывает файл настроек, запускает тест, а затем пишет отчет.

Итак, чтобы сказать, чтобы он закрылся - я бы:

  • Нажмите кнопку «Стоп» в «Приложении Test Controller»,
  • который пишет в файл настроек,
  • который читается «приложением Test Runner»
  • что останавливается, то
  • пишет в файл отчета, чтобы сказать, что он остановлен
  • «Приложение Test Controller» читает отчет и обновляет статус
  • и так далее...

Однако, прежде чем я продолжу и разделю приложение на две части, мне интересно, есть ли какой-либо другой очевидный способ справиться с этой проблемой. Я подозреваю, что это, вероятно, довольно распространенный и хорошо проторенный путь.

Также есть ли более простой способ отправки сообщений между двумя приложениями, которые находятся на одном компьютере?


person Community    schedule 08.05.2010    source источник


Ответы (1)


Вам нужно будет реализовать некоторую многопоточность, чтобы управлять несколькими процессами одновременно. Таким образом, ваше приложение не перестанет отвечать на запросы, пока вы выполняете какие-то другие задачи в фоновом режиме.

person Community    schedule 08.05.2010
comment
спасибо - ключевое слово "threading" мне было нужно... это дало мне много работы. Я нашел это: stackoverflow.com/questions/209774/does-php- наличие потоков - person JW.; 08.05.2010