Thread overview | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
August 20, 2015 flush MessageBox | ||||
---|---|---|---|---|
| ||||
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 |
August 20, 2015 Re: flush MessageBox | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris | 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.
|
August 21, 2015 Re: flush MessageBox | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | 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(); }`
|
August 21, 2015 Re: flush MessageBox | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris | 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.
|
August 21, 2015 Re: flush MessageBox | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | 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.
|
August 21, 2015 Re: flush MessageBox | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris | On Friday, 21 August 2015 at 14:35:53 UTC, Chris wrote:
> 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);
>> }
Thanks by the way. This does the trick.
|
August 21, 2015 Re: flush MessageBox | ||||
---|---|---|---|---|
| ||||
Posted in reply to Chris | On Friday, 21 August 2015 at 14:35:53 UTC, Chris wrote: > On Friday, 21 August 2015 at 12:59:09 UTC, John Colvin wrote: >> [...] > > 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. yes, it would be better. Please file an enhancement request: https://issues.dlang.org |
August 24, 2015 Re: flush MessageBox | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On Friday, 21 August 2015 at 17:05:56 UTC, John Colvin wrote: > On Friday, 21 August 2015 at 14:35:53 UTC, Chris wrote: >> On Friday, 21 August 2015 at 12:59:09 UTC, John Colvin wrote: >>> [...] >> >> 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. > > yes, it would be better. Please file an enhancement request: https://issues.dlang.org Done. https://issues.dlang.org/show_bug.cgi?id=14953 |
Copyright © 1999-2021 by the D Language Foundation