www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Concurrency on Windows (spawn)

reply "Chris" <wendlec tcd.ie> writes:
Windows: in a D-DLL I'm trying to spawn a thread. However, 
nothing happens

auto myThread = spawn(&myFunction, thisTid);
send(myThread, arg);

The thread is never called. Any ideas? Thanks!

PS In an old DLL it used to work, there I called it with only one 
argument, i.e. spawn(&myFunction). Is thisTid messing it up, do I 
need to pass something else?
Jun 18 2014
parent reply "Chris" <wendlec tcd.ie> writes:
On Wednesday, 18 June 2014 at 11:57:06 UTC, Chris wrote:
 Windows: in a D-DLL I'm trying to spawn a thread. However, 
 nothing happens

 auto myThread = spawn(&myFunction, thisTid);
 send(myThread, arg);

 The thread is never called. Any ideas? Thanks!

 PS In an old DLL it used to work, there I called it with only 
 one argument, i.e. spawn(&myFunction). Is thisTid messing it 
 up, do I need to pass something else?
Mystery solved. There was an audio delay so that the program had already finished, before the thread was properly executed. I _loooove_ Windows! Not!
Jun 18 2014
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 06/18/2014 06:28 AM, Chris wrote:
 On Wednesday, 18 June 2014 at 11:57:06 UTC, Chris wrote:
 Windows: in a D-DLL I'm trying to spawn a thread. However, nothing
 happens

 auto myThread = spawn(&myFunction, thisTid);
 send(myThread, arg);

 The thread is never called. Any ideas? Thanks!

 PS In an old DLL it used to work, there I called it with only one
 argument, i.e. spawn(&myFunction). Is thisTid messing it up, do I need
 to pass something else?
Mystery solved. There was an audio delay so that the program had already finished, before the thread was properly executed. I _loooove_ Windows! Not!
That can happen on Linux as well. So, the owner may have to call thread_joinAll() to wait for the worker: import core.thread; auto myThread = spawn(&myFunction, thisTid); send(myThread, arg); // ... sometime before the program ends: thread_joinAll(); Ali
Jun 18 2014
parent reply "Kapps" <opantm2+spam gmail.com> writes:
On Wednesday, 18 June 2014 at 15:03:55 UTC, Ali Çehreli wrote:
 On 06/18/2014 06:28 AM, Chris wrote:
 On Wednesday, 18 June 2014 at 11:57:06 UTC, Chris wrote:
 Windows: in a D-DLL I'm trying to spawn a thread. However, 
 nothing
 happens

 auto myThread = spawn(&myFunction, thisTid);
 send(myThread, arg);

 The thread is never called. Any ideas? Thanks!

 PS In an old DLL it used to work, there I called it with only 
 one
 argument, i.e. spawn(&myFunction). Is thisTid messing it up, 
 do I need
 to pass something else?
Mystery solved. There was an audio delay so that the program had already finished, before the thread was properly executed. I _loooove_ Windows! Not!
That can happen on Linux as well. So, the owner may have to call thread_joinAll() to wait for the worker: import core.thread; auto myThread = spawn(&myFunction, thisTid); send(myThread, arg); // ... sometime before the program ends: thread_joinAll(); Ali
Alternatively, one should use non-daemon threads for this purpose. http://dlang.org/phobos/core_thread.html#.Thread.isDaemon
Jun 18 2014
parent "Chris" <wendlec tcd.ie> writes:
On Wednesday, 18 June 2014 at 15:23:11 UTC, Kapps wrote:
 On Wednesday, 18 June 2014 at 15:03:55 UTC, Ali Çehreli wrote:
 On 06/18/2014 06:28 AM, Chris wrote:
 On Wednesday, 18 June 2014 at 11:57:06 UTC, Chris wrote:
 Windows: in a D-DLL I'm trying to spawn a thread. However, 
 nothing
 happens

 auto myThread = spawn(&myFunction, thisTid);
 send(myThread, arg);

 The thread is never called. Any ideas? Thanks!

 PS In an old DLL it used to work, there I called it with 
 only one
 argument, i.e. spawn(&myFunction). Is thisTid messing it up, 
 do I need
 to pass something else?
Mystery solved. There was an audio delay so that the program had already finished, before the thread was properly executed. I _loooove_ Windows! Not!
That can happen on Linux as well. So, the owner may have to call thread_joinAll() to wait for the worker: import core.thread; auto myThread = spawn(&myFunction, thisTid); send(myThread, arg); // ... sometime before the program ends: thread_joinAll(); Ali
Alternatively, one should use non-daemon threads for this purpose. http://dlang.org/phobos/core_thread.html#.Thread.isDaemon
Yeah, I've read about that, I think Adam mentions this in his cookbook as well. For my application the thread merely plays an audio file and is interrupted as soon as new input comes. The issue only came up, because in a test program the app finished, before Windows started to play (audio delay). In the real world app this isn't a problem cause it stays up an running. But still, I'm experiencing some weird behavior that might be down to the whole threading thing. Happy debugging!
Jun 19 2014