Я только что сделал свое первое правильное небольшое настольное приложение с графическим интерфейсом, которое в основном обертывает интерфейс графического интерфейса (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» читает отчет и обновляет статус
- и так далее...
Однако, прежде чем я продолжу и разделю приложение на две части, мне интересно, есть ли какой-либо другой очевидный способ справиться с этой проблемой. Я подозреваю, что это, вероятно, довольно распространенный и хорошо проторенный путь.
Также есть ли более простой способ отправки сообщений между двумя приложениями, которые находятся на одном компьютере?