Примите во внимание, что использование WaitForSingleObject
может получить Вас в проблему в этом сценарии. Следующее отрезано от подсказки относительно моего веб-сайта:
проблема возникает, потому что Ваше приложение имеет окно, но не качает сообщения. Если порожденное приложение вызовет SendMessage с одной из широковещательных целей ( HWND_BROADCAST или HWND_TOPMOST), то SendMessage не возвратится к новому приложению, пока все приложения не обработали сообщение - но Ваше приложение не может обработать сообщение, потому что это не качает сообщения...., таким образом, новое приложение запирается, таким образом, Ваше ожидание никогда не успешно выполняется.... МЕРТВАЯ БЛОКИРОВКА.
, Если Вы имеете неограниченный контроль над порожденным приложением, тогда существуют меры, которые можно принять, такие как использование SendMessageTimeout, а не SendMessage (например, для инициирования DDE, если кто-либо все еще использует это). Но существуют ситуации, которые вызывают неявные широковещательные сообщения SendMessage, над которыми Вы не имеете никакого контроля, такого как использование SetSysColors API, например.
единственные безопасные окольные пути это:
MsgWaitForMultipleObjects
API. Да, используйте call_user_func_array ()
:
call_user_func_array('function_name', $parameters_array);
Вы также можете использовать это для вызова методов в классе:
class A {
public function doStuff($a, $b) {
echo "[$a,$b]\n";
}
}
$a = new A;
call_user_func_array(array($a, 'doStuff'), array(23, 34));
Вы можете использовать eval
:
eval("$func_name(" . implode($params, ",") . ");");
Хотя вам, возможно, придется проделать некоторые уловки лямбда, чтобы ваши параметры цитировались и / или экранировались:
$quoted_escaped_params = array_map(create_function('$a', 'return "\"". str_replace("\"",` "\\\"", $a) . "\""'), $params);