On Friday, 19 January 2018 at 20:35:14 UTC, Chris M. wrote:
On Friday, 19 January 2018 at 18:18:31 UTC, Ali Çehreli wrote:
On 01/19/2018 09:46 AM, Chris M. wrote:
> I tried putting an infinite loop inside main() as well,
didn't seem to
> help.
Another reason is an exception thrown in the child thread. If
the exception is not caught, it will terminate the child
thread and the main will not know anything about it. I have
something about that here:
http://ddili.org/ders/d.en/concurrency.html#ix_concurrency.exception,%20concurrency
> I'm guessing there's probably a better way to make the main
thread
> wait?
std.core.thread_joinAll is a way but you would want to tell
the other thread to terminate first.
https://dlang.org/phobos/core_thread.html#.thread_joinAll
So, instead of while(true), try while(someCondition). In that
case the main thread sets the condition e.g. by sending a
message and then joins.
Ali
I'm not sure what's going on. I've tried all sorts of things
from your link, it just runs the function once and exits every
time. There aren't any exceptions being thrown from the thread.
That robot example is basically exactly what I'm doing, and yet
even that doesn't seem to resolve it.
What I tried
import std.net.curl;
import device;
import std.datetime.systime;
impor std.concurrency;
void deviceDownloader()
{
auto APIServer = HTTP();
APIServer.addRequestHeader("X-Auth-Token:", AuthToken);
APIServer.onProgress = delegate int(size_t dl, size_t dln,
size_t ul, size_t uln)
{
if (dl != 0)
write("Progress: downloaded ", dln, " of ", dl, "\r");
return 0;
};
while (true)
{
auto currentTime = Clock.currTime;
if (currentTime.minute % 5 == 0 && currentTime.second ==
0)
retrieveDevices(URL, APIServer); // info retrieved
and stored here
ownerTid.send("tmp");
}
}
void main()
{
spawn(&deviceDownloader);
while (true)
{
auto msg = receiveOnly!string();
}
}