Example showing the usage of events.
The documentation still is very thin, so I'm not sure, the example is the best solution. But it works.
*/useparallel{Channel,Runtime,Events,EventsEvent};$myThread= function(Channel $channel) {$events= newEvents();$events->addChannel($channel);//$events->setBlocking(false); //Uncomment to don't block on Events::poll()$events->setTimeout(1000000);//Comment when not blockingwhile(true)
{/*
...
Your code.
...
*/
//Read all available eventstry
{$event=NULL;
do
{$event=$events->poll();//Returns non-null if there is an eventif($event&&$event->source=='myChannel')
{//It seems, the target gets deleted after returning an event,
//so add it again.$events->addChannel($channel);
if($event->type==EventType::Read)
{
if(is_array($event->value) &&count($event->value) >0)
{
if($event->value['name'] =='stop')
{
echo'Stopping thread';
return;//Stop}
else
{
echo'Event: '.$event->value['name'].' => '.$event->value['value'].PHP_EOL;
}
}
}
else if($event->type==EventType::Close) return;//Stop}
}
while($event);
}
catch(EventsErrorTimeout $ex)
{//Timeoutecho'Timeout'.PHP_EOL;
}
}
};
classMyClass{
private$runtime;
private$future;
private$channel;
public functionstart() {//Create runtime$this->runtime= newRuntime();//Create buffered channel.
//Buffered channels don't block on Channel::send().
//Note that target names need to be unique within the process.$this->channel=Channel::make('myChannel',Channel::Infinite);
global$myThread;$this->future=$this->runtime->run($myThread, [$this->channel]);
}
public functionstop() {$this->channel->send(['name'=>'stop','value'=>true]);$this->future->value();//Wait for thread to finish$this->channel->close();
}
public functionemit(string $name,$value)
{$this->channel->send(['name'=>$name,'value'=>$value]);
}
}$a= newMyClass();$a->start();
for($i=0;$i<5;$i++)
{$a->emit('test',$i);sleep(0.5);
}sleep(2);
for($i=5;$i<10;$i++)
{$a->emit('test',$i);sleep(0.5);
}$a->stop();?>