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
messagesandsignalsto 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 activityThis 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.
Comments powered by Disqus