Выполнение фонового цикла без зависания графическо оболочки. Возможно?

103 views
Skip to first unread message

Alex Shcneider

unread,
Jun 15, 2010, 6:33:06 AM6/15/10
to Русское сообщество PHP-GTK
Добрый день!

Столкнулся с одной проблемой, решение которой так и не смог
придумать... Может Вы мне поможете?

Я решил переписать один из своих скриптов используя PHP-GTK, который
до этого выполнялся в командной строке.
Благодаря Вашем статьям по PHP-GTK проблем с ним не возникло - все
написанно понятно и четко. Спасибо Вам огромное!
Но вот проблема подкралась откуда не ждал - скрипту переодически
необходимо входить в долгие циклы (while(1){}), чтобы выполнить то,
для чего он предназначен.. Но вот графический интерфейс при этом
"умирает"... И пока цикл не завершится - Windows определяет окно как
"неотвечающее"...

На ум сразу пришло создать 2 потока, первый бы отвечал за логику, а
второй за GUI, но увы - ничего подходящего под Win для создание тредов
я не нашел.

Возможно ли решить как то эту проблему?
Спасибо!

Shecspi

unread,
Jun 15, 2010, 9:55:22 AM6/15/10
to Русское сообщество PHP-GTK
К сожалению, каких-либо наработок по многопоточности для Windows я не
встречал. На никсах это легко реализуется, а вот вин...

GoTLiuM InSPiRiT

unread,
Jun 15, 2010, 9:57:53 AM6/15/10
to php-g...@googlegroups.com
в целом как решение создать новый процесс. и научить процессы
общаться;) правда не унаследуется из главного процесса ничего.

15 июня 2010 г. 18:55 пользователь Shecspi <she...@gmail.com> написал:

> --
> Вы получили это сообщение, поскольку подписаны на группу Русское сообщество PHP-GTK.
>
> Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу php-g...@googlegroups.com.
> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу php-gtk-ru+...@googlegroups.com.
> О дополнительных функциях можно узнать в группе по адресу http://groups.google.com/group/php-gtk-ru?hl=ru.
>
>

--
Best regards, GoTLiuM InSPiRiT.
E-mail: sup...@metall-zone.com
Site: www.metall-zone.com
Phone: +998902982884

Shecspi

unread,
Jun 15, 2010, 12:53:06 PM6/15/10
to Русское сообщество PHP-GTK
В большинстве случаев вариант создания нового процесса неприемлем,
т.к. новый процесс будет совершенно неуправляем. И разработка
интерфейса для общения этих 2 процессов мне представляется крайне
затруднительной.

On 15 июн, 17:57, GoTLiuM InSPiRiT <gotl...@gmail.com> wrote:
> в целом как решение создать новый процесс. и научить процессы
> общаться;) правда не унаследуется из главного процесса ничего.
>

> 15 июня 2010 г. 18:55 пользователь Shecspi <shec...@gmail.com> написал:


>
>
>
>
>
> > К сожалению, каких-либо наработок по многопоточности для Windows я не
> > встречал. На никсах это легко реализуется, а вот вин...
>
> > On 15 июн, 14:33, Alex Shcneider <alex.shcnei...@gmail.com> wrote:
> >> Добрый день!
>
> >> Столкнулся с одной проблемой, решение которой так и не смог
> >> придумать... Может Вы мне поможете?
>
> >> Я решил переписать один из своих скриптов используя PHP-GTK, который
> >> до этого выполнялся в командной строке.
> >> Благодаря Вашем статьям по PHP-GTK проблем с ним не возникло - все
> >> написанно понятно и четко. Спасибо Вам огромное!
> >> Но вот проблема подкралась откуда не ждал - скрипту переодически
> >> необходимо входить в долгие циклы (while(1){}), чтобы выполнить то,
> >> для чего он предназначен.. Но вот графический интерфейс при этом
> >> "умирает"... И пока цикл не завершится - Windows определяет окно как
> >> "неотвечающее"...
>
> >> На ум сразу пришло создать 2 потока, первый бы отвечал за логику, а
> >> второй за GUI, но увы - ничего подходящего под Win для создание тредов
> >> я не нашел.
>
> >> Возможно ли решить как то эту проблему?
> >> Спасибо!
>
> > --
> > Вы получили это сообщение, поскольку подписаны на группу Русское сообщество PHP-GTK.
>
> > Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу php-g...@googlegroups.com.
> > Чтобы отменить подписку на эту группу, отправьте сообщение по адресу php-gtk-ru+...@googlegroups.com.

> > О дополнительных функциях можно узнать в группе по адресуhttp://groups.google.com/group/php-gtk-ru?hl=ru.


>
> --
> Best regards, GoTLiuM InSPiRiT.

> E-mail: supp...@metall-zone.com
> Site:  www.metall-zone.com
> Phone:  +998902982884

GoTLiuM InSPiRiT

unread,
Jun 15, 2010, 1:41:26 PM6/15/10
to php-g...@googlegroups.com
Но всё же просто предложил как вариант:)

15 июня 2010 г. 21:53 пользователь Shecspi <she...@gmail.com> написал:

> О дополнительных функциях можно узнать в группе по адресу http://groups.google.com/group/php-gtk-ru?hl=ru.
>
>

--
Best regards, GoTLiuM InSPiRiT.

E-mail: got...@gmail.com
Phone: +998902982884

Alex Shcneider

unread,
Jun 17, 2010, 1:04:24 PM6/17/10
to Русское сообщество PHP-GTK
Вот такой вопрос..

По сути приложение уходит в бесконечный цикл в методе Gtk::main(), как
я понял.
Может существуют какие-либо штатные средства, заставить Gtk::main()
вызывать пользовательскую функцию из своего цикла...

Примерно так:
Gtk::main('my_function');

function my_function() {
// Логика
}

Такое решение позволило бы в одном потоке без зависания GUI к
выполнять основную логику...
Подскажите пожалуйста, есть ли что либо похожее в GTK2 ?

Спасибо!

Shecspi

unread,
Jun 17, 2010, 1:16:45 PM6/17/10
to Русское сообщество PHP-GTK
В любом случае, без второго потока
от зависаний не избавиться. Пока не выполнится весь PHP-код
программы, прорисовка интерфейса не будет выполнена. И структура
программы, расположение блоков кода не будут иметь совершенно никакого
значения. Как это ни прескорбно, но это так..

GoTLiuM InSPiRiT

unread,
Jun 17, 2010, 1:26:56 PM6/17/10
to php-g...@googlegroups.com
ля-ля-ля! Linux rules!

17 июня 2010 г. 22:16 пользователь Shecspi <she...@gmail.com> написал:

NRN

unread,
Jun 17, 2010, 2:05:36 PM6/17/10
to php-g...@googlegroups.com
Попробуйте,
http://www.ibm.com/developerworks/ru/library/os-php-multitask/index.html
листинг 5.

17 июня 2010 г. 20:04 пользователь Alex Shcneider <alex.sh...@gmail.com> написал:

Спасибо!

--
Вы получили это сообщение, поскольку подписаны на группу Русское сообщество PHP-GTK.

Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу php-g...@googlegroups.com.
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу php-gtk-ru+...@googlegroups.com.

GoTLiuM InSPiRiT

unread,
Jun 17, 2010, 2:16:35 PM6/17/10
to php-g...@googlegroups.com
что-то мне не верится что это заработает в винде;)

17 июня 2010 г. 23:05 пользователь NRN <nrn...@gmail.com> написал:

--

Alex Shcneider

unread,
Jun 17, 2010, 2:30:45 PM6/17/10
to Русское сообщество PHP-GTK
Shecspi, NRN спасибо!

Shecspi, жаль. Очень жаль(
NRN, я читал эту, и еще кучу статей по поводу псевдо многопоточности
на PHP.
Но все они не подходят, к сожалению..

Раз не вышло сделать GUI, помогите хотя бы от висящей консоли
избавиться, пожалуйста!
Рассклад таков:
.bat запускает PHP скрипт.
Первые 5-10 секунд скрипт инициализируется и выводит в консоль
состояние инициализации (это необходимо, т.к. вероятность что какое
либо условие будет не так - велика)...
После инициализации скрипт входит в бесконечное прослушивание
локлаьного порта.
А вот окно с консолью висит мертвым грузом (т.к. дальнейшей работой
можно управлять через Telnel или веб интерфейс).
При попытке закрыть консоль, вместе с нею и умирает процесс php.

Подскажите плз, как избавиться от консоли, оставив в памяти активный
процесс php (типа демон ^_^)?

Еще раз, Спасибо!


GoTLiuM InSPiRiT

unread,
Jun 17, 2010, 2:39:27 PM6/17/10
to php-g...@googlegroups.com
не выйдет. юзай *nix, либо пиши сервер приложение, которое будет висеть в трэе!
я делал именно так. так же советую почитать о том как это решает
apache либо mysql в винде.
в никасах всё просто(posix). при прослушивании, идёт форк основного процесса.
как вариант изучи что такое service. есть так же PsExec.
для простого приложения, можно создать основной процесс, который будет
создавать новые,
и ожидать ответа. основное приложение, будет обращаться к нему. такой
вариант я думал
использовать во фреймворке. только руки до этого не дойдут.
либо пиши сам dll или ищи готовое решение.

17 июня 2010 г. 23:30 пользователь Alex Shcneider
<alex.sh...@gmail.com> написал:

Alex Shcneider

unread,
Jun 17, 2010, 2:52:50 PM6/17/10
to Русское сообщество PHP-GTK
У меня, к сожалению, нет опыта по работе в никсах...
Но про форк читал. И про pcntl_* для никсов то же..
С Cи/Cи++ знаком на уровне
int main() {
std::cout << "Hello, dumb!";
}
, так что своей dll Не пахнет))))

Я почти решил проблему, по свойму, пусть не много коряво, но работает
так как мне надо)
GUI (PHP-GTK) и основная логика запускаются отдельными процессами, и
далее общаются между собой (правда GUI не сильно "разговорчив")...
Но с одной "корявостью" я смриться не могу - это постоянно висящая
консоль от запуска "логики" программы...
Закрываешь - падает php... Беда(

On 17 июн, 21:39, GoTLiuM InSPiRiT <gotl...@gmail.com> wrote:
> не выйдет. юзай *nix, либо пиши сервер приложение, которое будет висеть в трэе!
> я делал именно так. так же советую почитать о том как это решает
> apache либо mysql в винде.
> в никасах всё просто(posix). при прослушивании, идёт форк основного процесса.
> как вариант изучи что такое service. есть так же PsExec.
> для простого приложения, можно создать основной процесс, который будет
> создавать новые,
> и ожидать ответа. основное приложение, будет обращаться к нему. такой
> вариант я думал
> использовать во фреймворке. только руки до этого не дойдут.
> либо пиши сам dll или ищи готовое решение.
>
> 17 июня 2010 г. 23:30 пользователь Alex Shcneider

> <alex.shcnei...@gmail.com> написал:


>
>
>
>
>
> > Shecspi, NRN спасибо!
>
> > Shecspi, жаль. Очень жаль(
> > NRN, я читал эту, и еще кучу статей по поводу псевдо многопоточности
> > на PHP.
> > Но все они не подходят, к сожалению..
>
> > Раз не вышло сделать GUI, помогите хотя бы от висящей консоли
> > избавиться, пожалуйста!
> > Рассклад таков:
> > .bat запускает PHP скрипт.
> > Первые 5-10 секунд скрипт инициализируется и выводит в консоль
> > состояние инициализации (это необходимо, т.к. вероятность что какое
> > либо условие будет не так - велика)...
> > После инициализации скрипт входит в бесконечное прослушивание
> > локлаьного порта.
> > А вот окно с консолью висит мертвым грузом (т.к. дальнейшей работой
> > можно управлять через Telnel или веб интерфейс).
> > При попытке закрыть консоль, вместе с нею и умирает процесс php.
>
> > Подскажите плз, как избавиться от консоли, оставив в памяти активный
> > процесс php (типа демон ^_^)?
>
> > Еще раз, Спасибо!
>
> > --
> > Вы получили это сообщение, поскольку подписаны на группу Русское сообщество PHP-GTK.
>
> > Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу php-g...@googlegroups.com.
> > Чтобы отменить подписку на эту группу, отправьте сообщение по адресу php-gtk-ru+...@googlegroups.com.

> > О дополнительных функциях можно узнать в группе по адресуhttp://groups.google.com/group/php-gtk-ru?hl=ru.


>
> --
> Best regards, GoTLiuM InSPiRiT.

> E-mail: gotl...@gmail.com
> Phone:  +998902982884

GoTLiuM InSPiRiT

unread,
Jun 17, 2010, 3:00:37 PM6/17/10
to php-g...@googlegroups.com
приведи пример программы для начала.
сложно понять без примера твою реализацию и замысел.
надеюсь это ты понимаешь и сам.
после возможно тебе кто-то что-то и предложит, или поправит.
в php действительно сложно с многопоточностью.
я вот писал в c# свободно приложения и проблем с этим не было.
в си всё просто:
pid = fork();
switch(pid) {
case 0:
chdir("/");
exit(0);
case -1:
printf("Failed");
break;
default:
printf("Success");
exit(0);
}

17 июня 2010 г. 23:52 пользователь Alex Shcneider
<alex.sh...@gmail.com> написал:

> О дополнительных функциях можно узнать в группе по адресу http://groups.google.com/group/php-gtk-ru?hl=ru.
>
>

--
Best regards, GoTLiuM InSPiRiT.

E-mail: got...@gmail.com
Phone: +998902982884

Alex Shcneider

unread,
Jun 17, 2010, 3:16:54 PM6/17/10
to Русское сообщество PHP-GTK
На php под никсы точно так же:

$pid = pcntl_fork();
if ($pid == -1) {
exit('Failed!');
} elseif ($pid) {
exit('Parent kill myself!');
} else {
echo "I`am child!";
}

Смысл программы в следующем.
Она по сути является ретранслирующем прокси сервером. После запуска
начинает слушать localhost на определенном порту.
В настройках браузера прокси сервером указывается localhost:port. Так
что все запросы идут к скрипту, который POST`ом отправляет на
серверную часть скрипта, которая находится на виртуальном хостинге.
Та в свою очередь разбирает заголовки, загружает необходимую
страничку, и отдает результат локлаьному скрипту, который
ретранслирует их обратно браузеру.

Я думаю, принцип работы логики ясен.

Теперь что касается связки логики с GUI.
Логика запускается первой, и от нее остается стандартная консоль
windows.
После инициализации логики запускается GUI, написанный на GTK-PHP.
Общаются они через 2 файла.
В первый файл пишет "логика", а GTK читает, и выполняет.
Во второй - наоборот, пишет GTK, читает "логика"...

Вот такой принцип... Если в краце


On 17 июн, 22:00, GoTLiuM InSPiRiT <gotl...@gmail.com> wrote:
> приведи пример программы для начала.
> сложно понять без примера твою реализацию и замысел.
> надеюсь это ты понимаешь и сам.
> после возможно тебе кто-то что-то и предложит, или поправит.
> в php действительно сложно с многопоточностью.
> я вот писал в c# свободно приложения и проблем с этим не было.
> в си всё просто:
> pid = fork();
> switch(pid) {
>   case 0:
>     chdir("/");
>     exit(0);
>   case -1:
>     printf("Failed");
>     break;
>   default:
>     printf("Success");
>     exit(0);
>
> }
>
> 17 июня 2010 г. 23:52 пользователь Alex Shcneider

> <alex.shcnei...@gmail.com> написал:

GoTLiuM InSPiRiT

unread,
Jun 17, 2010, 3:22:26 PM6/17/10
to php-g...@googlegroups.com
ну тогда какая проблема?!
GUI пусть по средству time-аута пишет нужное в файл и забирает из второго.
ничего сложного нет. консоль закрыть можно по средству php-win.exe,
через ярлык и трей.


18 июня 2010 г. 0:16 пользователь Alex Shcneider
<alex.sh...@gmail.com> написал:

> О дополнительных функциях можно узнать в группе по адресу http://groups.google.com/group/php-gtk-ru?hl=ru.
>
>

--
Best regards, GoTLiuM InSPiRiT.

E-mail: got...@gmail.com
Phone: +998902982884

Alex Shcneider

unread,
Jun 17, 2010, 3:27:33 PM6/17/10
to Русское сообщество PHP-GTK
Ну проблема...
1) После прорисовки окна Gtk::main() забирает все брозды правления
себе (входить в бесконечный цикл, который по сути следит за обработкой
событий GUI и т.д).
Поэтому единственное что я придумал, это кнопка "обновить". По ее
нажатию происходит чтение файла от логики.
2) Я запускаю обычным php.exe (не GTK).

On 17 июн, 22:22, GoTLiuM InSPiRiT <gotl...@gmail.com> wrote:
> ну тогда какая проблема?!
> GUI пусть по средству time-аута пишет нужное в файл и забирает из второго.
> ничего сложного нет. консоль закрыть можно по средству php-win.exe,
> через ярлык и трей.
>
> 18 июня 2010 г. 0:16 пользователь Alex Shcneider

> <alex.shcnei...@gmail.com> написал:

GoTLiuM InSPiRiT

unread,
Jun 17, 2010, 3:32:40 PM6/17/10
to php-g...@googlegroups.com
повторюсь, не нужно кнопки, нужно просто использовать timeout add.
так же в группе обсуждалось php-win.exe. так что нужно прочесть на
данный момент добавление событий и запуск под винОС. направление взял
верное.

18 июня 2010 г. 0:27 пользователь Alex Shcneider
<alex.sh...@gmail.com> написал:

> О дополнительных функциях можно узнать в группе по адресу http://groups.google.com/group/php-gtk-ru?hl=ru.
>
>

--
Best regards, GoTLiuM InSPiRiT.

E-mail: got...@gmail.com
Phone: +998902982884

Alex Shcneider

unread,
Jun 17, 2010, 3:41:09 PM6/17/10
to Русское сообщество PHP-GTK
Ок. Спасибо. Сейчас попробую поискать.
Буду благодарен за прямую ссылку.

On 17 июн, 22:32, GoTLiuM InSPiRiT <gotl...@gmail.com> wrote:
> повторюсь, не нужно кнопки, нужно просто использовать timeout add.
> так же в группе обсуждалось php-win.exe. так что нужно прочесть на
> данный момент добавление событий и запуск под винОС. направление взял
> верное.
>
> 18 июня 2010 г. 0:27 пользователь Alex Shcneider

> <alex.shcnei...@gmail.com> написал:

> >> >> > О дополнительных...
>
> продолжение >>

Message has been deleted

Alex Shcneider

unread,
Jun 17, 2010, 3:52:42 PM6/17/10
to Русское сообщество PHP-GTK
Использовал php-win.exe - именно то что я искал, cmd можно закрыть, а
php не упадет..
Но вот вывод напрочь отсутствует.. Плохо(

GoTLiuM InSPiRiT

unread,
Jun 17, 2010, 3:53:18 PM6/17/10
to php-g...@googlegroups.com
$timeout = Gtk::timeout_add(time, foo);
Gtk::timeout_remove($timeout);

18 июня 2010 г. 0:41 пользователь Alex Shcneider
<alex.sh...@gmail.com> написал:

> О дополнительных функциях можно узнать в группе по адресу http://groups.google.com/group/php-gtk-ru?hl=ru.
>
>

--
Best regards, GoTLiuM InSPiRiT.

E-mail: got...@gmail.com
Phone: +998902982884

NRN

unread,
Jun 17, 2010, 5:06:12 PM6/17/10
to php-g...@googlegroups.com
Тот пример что я привел, работает под виндой но в данном случаи это не то что нужно, нужно как я понимаю не много поточность, а много процесорность.
Чтоб избавится от коносоли под виндой нужно писать службу, так как у винды нету понятия демона и так дальше.
А с службы уже запускать php скрипт, тогда он должен по идеи работать в фоне.
Сам не пробовал, но когда была такая надобности не помню даже для чего, делал ярлык на бат файл, и запускал именно его, а в нем в свойствах просто выставлял запускать в свернутом состоянии.

17 июня 2010 г. 22:53 пользователь GoTLiuM InSPiRiT <got...@gmail.com> написал:

GoTLiuM InSPiRiT

unread,
Jun 18, 2010, 1:39:55 AM6/18/10
to php-g...@googlegroups.com
python как всегда впереди. решил реализовать что-то на нём. и вуаля:

import sys, time, gtk
from threading import Thread

count = 0

class Bg (Thread):
def __init__ (self):
Thread.__init__(self)

def run (self):
global count;
time.sleep(2);
count += 1;
print "pr: ", count


def start(button):
a = Bg()
a.start()

def destroy(*args):
window.hide()
gtk.main_quit()


gtk.gdk.threads_init()

window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.connect("destroy", destroy)

button = gtk.Button("Start")
button.connect("clicked", start)
window.add(button)
button.show()

window.show_all()
gtk.main()


18 июня 2010 г. 2:06 пользователь NRN <nrn...@gmail.com> написал:

Евгений vamp

unread,
Jun 24, 2010, 3:55:16 PM6/24/10
to php-g...@googlegroups.com
молодец

18.06.10, GoTLiuM InSPiRiT<got...@gmail.com> написал(а):

Reply all
Reply to author
Forward
0 new messages