Non Blocking Channel Operations in Scilab
Our example demonstrates non-blocking operations using Scilab’s event handling mechanism. Since Scilab doesn’t have built-in channels or select statements like some other languages, we’ll simulate similar behavior using timers and callbacks.
function main()
// Create timer objects to simulate channels
messages = timer();
signals = timer();
// Simulate a non-blocking receive
function receiveMessage()
disp("received message")
end
function noMessage()
disp("no message received")
end
// Set up timer for messages
messages.TimerFcn = receiveMessage;
messages.StartDelay = 0.1; // Short delay to simulate immediate check
messages.TasksToExecute = 1;
start(messages);
sleep(200); // Wait for timer to possibly execute
if ~messages.Running then
noMessage();
end
// Simulate a non-blocking send
msg = "hi";
function sendMessage()
disp("sent message " + msg)
end
function noSend()
disp("no message sent")
end
// Set up timer for sending
messages.TimerFcn = sendMessage;
messages.StartDelay = 0.1;
start(messages);
sleep(200);
if ~messages.Running then
noSend();
end
// Simulate multi-way non-blocking select
function receiveSignal()
disp("received signal")
end
function noActivity()
disp("no activity")
end
messages.TimerFcn = receiveMessage;
signals.TimerFcn = receiveSignal;
messages.StartDelay = 0.1;
signals.StartDelay = 0.1;
start(messages);
start(signals);
sleep(200);
if ~messages.Running & ~signals.Running then
noActivity();
end
end
main()
This Scilab code simulates non-blocking channel operations using timers. Here’s how it works:
We create timer objects
messages
andsignals
to simulate channels.For the non-blocking receive, we set up a timer with a short delay. If the timer executes, it simulates receiving a message. If it doesn’t execute before we check, we simulate no message received.
The non-blocking send works similarly. We set up a timer, and if it executes, we simulate sending a message. Otherwise, we simulate no message sent.
For the multi-way non-blocking select, we set up both timers. If neither timer executes before we check, we simulate no activity.
To run this program, save it as a .sce
file and execute it in Scilab:
--> exec('non_blocking_operations.sce', -1)
no message received
no message sent
no activity
This example demonstrates how to simulate non-blocking operations in Scilab. While it doesn’t provide the same level of concurrency as some other languages, it shows how you can use timers and callbacks to achieve similar behavior.