flush MessageBox

Chris via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Aug 21 07:35:52 PDT 2015


On Friday, 21 August 2015 at 12:59:09 UTC, John Colvin wrote:
> On Friday, 21 August 2015 at 10:43:22 UTC, Chris wrote:
>> On Thursday, 20 August 2015 at 15:57:47 UTC, John Colvin wrote:
>>> On Thursday, 20 August 2015 at 15:25:57 UTC, Chris wrote:
>>>> Is there a way to flush a thread's message box other than 
>>>> aborting the thread? MailBox is private:
>>>>
>>>> https://github.com/D-Programming-Language/phobos/blob/master/std/concurrency.d#L1778
>>>
>>> flush from inside the thread? You could call receiveTimeout 
>>> with a 0 timer in a loop until it returns false.
>>
>> Yes, from inside the thread. I have a worker thread (with 
>> receiveTimeout) that is started when the program starts and 
>> sits there waiting for input. I naively thought this was a 
>> great idea, until I noticed that when input comes fast the 
>> mailbox grows and the bloody thread won't stop until all the 
>> items in the mailbox are processed. I was looking for 
>> something like `if (abort) { mailbox.flush(); }`
>
> void flushMailbox()
> {
>     bool r;
>     do
>     {
>         r = receiveTimeout(Duration.zero, (Variant _){});
>     } while(r);
> }
>
> You could optimise that to more efficiently deal with the 
> actual types you're receiving, instead of making a Variant 
> every time, but it's probably not worth it. The compiler might 
> even optimise it away anyway.

Wouldn't it be easier to have a library function that can empty 
the mailbox immediately? It's a waste of time to have all items 
in the mailbox crash against a wall, before you can go on as in

[
item1  // cancel
item2  ===> do nothing return;
item3  ===> do nothing return;
]

In parts I find std.concurrency lacking. Simple things sometimes 
need workarounds.


More information about the Digitalmars-d-learn mailing list