Новая версия!
Написал для нашего не "русского гостя" класс, и решил его сюда выложить, в отдельную тему.
1) Что он дает? он вызывает определенную функцию в потоке, и по завершению колбэк
2) Как работает?
--- 1) Создает поток
--- 2) В потоке идет вызов указанной функции
--- 3) После завершения работы указанной функции - идет вызов колбэка, и удаления созданного потока в этом колбэке
Примеры использования
Пример 1
Пример 2
Пример 3
Велосипед ?
Да, я знаю что есть класс Antigate, но в нем не предусмотрено вызов нескольких экземпляров функций. И из за этого теряется конечный результат других вызовов
Просмотреть все скрипты подключения "в реальном времени"
Написал для нашего не "русского гостя" класс, и решил его сюда выложить, в отдельную тему.
1) Что он дает? он вызывает определенную функцию в потоке, и по завершению колбэк
2) Как работает?
--- 1) Создает поток
--- 2) В потоке идет вызов указанной функции
--- 3) После завершения работы указанной функции - идет вызов колбэка, и удаления созданного потока в этом колбэке
Примеры использования
Скрытый текст:
Пример 1
PHP код:
if(!function_exists('TestThread')) {
function TestThread($Text, $count) {
for($i = 0; $i < $count; ++$i) {
for($r = 0; $r < 15; ++$r) {
ThreadCall::c("memo1")->text = $Text . ' - i: '.$i.' r:'.$r;
}
}
ThreadCall::c("memo1")->text = file_get_contents('http://www.google.ru');
}
}
ThreadCall::Call('TestThread', null, array('TEST!', 200));
PHP код:
if(!function_exists('TestThread2')) {
function TestThread2($Text, $count) {
ThreadCall::c("Form1")->caption = 'Thread START!';
for($i = 0; $i < $count; ++$i) {
for($r = 0; $r < 15; ++$r) {
ThreadCall::c("memo1")->text = $Text . ' - i: '.$i.' r:'.$r;
}
}
ThreadCall::c("memo1")->text = file_get_contents('http://www.google.ru');
}
}
ThreadCall::Call('TestThread2', function($Result) {
c("Form1")->caption = 'Thread END!';
}, array('TEST!', 200));
Пример 3
PHP код:
if(!function_exists('TestThread3')) {
function TestThread3() {
for($i = 0; $i < 200; ++$i) {
for($r = 0; $r < 15; ++$r) {
ThreadCall::c("memo1")->text = 'TEST! - i: '.$i.' r:'.$r;
}
}
ThreadCall::c("memo1")->text = file_get_contents('http://www.google.ru');
}
}
ThreadCall::Call('TestThread3');
Велосипед ?
Да, я знаю что есть класс Antigate, но в нем не предусмотрено вызов нескольких экземпляров функций. И из за этого теряется конечный результат других вызовов
Просмотреть все скрипты подключения "в реальном времени"
Скрытый текст:
PHP код:
<?php
Class VTimer {
public $Self;
public function __construct() {
$this->Self = gui_create('TTimer', null);
}
public function __Set($Name, $Value) {
if (preg_match('#^on[A-Z][a-z]#i', $Name)) {
event_set($this->Self, $Name, $Value);
} else {
gui_propSet($this->Self, $Name, $Value);
}
}
public function __Get($Name) {
return gui_propGet($this->Self, $Name);
}
public function Free() {
event_set($this->Self, 'OnTimer', null);
gui_destroy($this->Self);
}
}
class ThreadCallObject {
public $obj = null;
function ThreadCallObject($name) {
$this->obj = $name;
}
function GetObj($name) {
if(empty($GLOBALS['Thread_class_'.__class__]['callBack_'.$name])) {
$GLOBALS['Thread_class_'.__class__]['callBack_'.$name] = c($name);
}
return $GLOBALS['Thread_class_'.__class__]['callBack_'.$name];
}
function FreeObj($name) {
if(!empty($GLOBALS['Thread_class_'.__class__]['callBack_'.$name])) {
unset($GLOBALS['Thread_class_'.__class__]['callBack_'.$name]);
}
}
function __get($name) {
return SyncEx(__class__ . '::get', array($this->obj, $name));
}
function __set($name, $value) {
Sync(__class__ . '::set', array($this->obj, $name, $value));
}
function __call($name, $args) {
return Sync(__class__ . '::call', array($this->obj, $name, $args));
}
public static function get($name, $property) {
application_processmessages();
return self::GetObj($name)->$property;
}
public static function set($name, $property, $value) {
application_processmessages();
self::GetObj($name)->$property = $value;
return $value;
}
public static function call($nameObj, $name, $args) {
application_processmessages();
return call_user_func_array(array(self::GetObj($nameObj), $name), $args);
}
}
class ThreadCall {
static function GetObj($name) {
if(empty($GLOBALS['Thread_class_'.__class__]['callBack_'.$name])) {
$GLOBALS['Thread_class_'.__class__]['callBack_'.$name] = new ThreadCallObject($name);
}
return $GLOBALS['Thread_class_'.__class__]['callBack_'.$name];
}
static function FreeObj($name) {
if(!empty($GLOBALS['Thread_class_'.__class__]['callBack_'.$name])) {
unset($GLOBALS['Thread_class_'.__class__]['callBack_'.$name]);
}
}
static function c($name) {
return self::GetObj($name);
}
static function callBack($Self, $Result) {
if($GLOBALS['Thread_class_'.__class__]['callBack'][$Self] <> null) {
call_user_func_array($GLOBALS['Thread_class_'.__class__]['callBack'][$Self], array(igbinary_unserialize($Result)));
}
gui_threadTerminate($Self);
event_set($Self, 'onExecute', null);
gui_threadFree($self);
unset($GLOBALS['Thread_class_'.__class__]['callBack'][$Self], $Self, $Result);
}
static function CallThread($Self) {
$args = igbinary_unserialize(gui_threadData($Self, 'args'));
if($args === null)
$args = array();
gui_threadSync($Self, 'ThreadCall::callBack', igbinary_serialize(call_user_func_array(
igbinary_unserialize(gui_threadData($Self, 'CallFunction')), $args
)));
gui_threadUnset($Self, 'CallFunction');
gui_threadUnset($Self, 'args');
unset($args);
}
public static function Call($CallFunction, $callBack = null, $args = null) {
if(!is_string($CallFunction)) return;
list($object, $method_name) = explode('::', $CallFunction);
if((!function_exists($CallFunction))&&(!method_exists($object, $method_name))) return;
$Thread = gui_threadCreate();
$GLOBALS['Thread_class_'.__class__]['callBack'][$Thread] = $callBack;
event_set($Thread, 'onExecute', __class__ . '::CallThread');
gui_threadData($Thread, 'CallFunction', igbinary_serialize($CallFunction));
gui_threadData($Thread, 'args', igbinary_serialize($args));
gui_threadResume($Thread);
unset($CallFunction, $callBack, $args, $Thread, $object, $method_name);
}
}
?>