Quantcast
Channel: Сообщество PHP DevelStudio - среда разработки программ
Viewing all articles
Browse latest Browse all 6336

Класс для вызова функций в потоке

$
0
0
Новая версия!


Написал для нашего не "русского гостя" класс, и решил его сюда выложить, в отдельную тему.

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)); 

Пример 2
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);
        }
    }
?>

Вложения

Viewing all articles
Browse latest Browse all 6336

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>