Я пытаюсь получить данные от оптоволокна http://vibed.org/api/vibe.core.core/runWorkerTaskH
"Запускает новую асинхронную задачу в рабочем потоке, возвращая дескриптор задачи."
Вот мой код:
import vibe.vibe;
import std.stdio;
import std.datetime;
import vibe.core.core;
string [] test_urls = ["http://127.0.0.1:8081/hck","http://127.0.0.1:8081/hck2","http://127.0.0.1:8081/hck3"];
struct MyUrl
{
string url;
string status;
}
MyUrl myUrl;
MyUrl [] myUrls;
shared static this()
{
foreach(url;test_urls)
{
myUrl.url = url;
myUrls ~= myUrl;
}
setTimer(2.seconds, toDelegate(&processing), true);
}
void main()
{
listenHTTP(":8080", &handleRequest);
runApplication();
}
void handleRequest(HTTPServerRequest req, HTTPServerResponse res)
{
}
void processing()
{
writeln("processing");
//foreach(url; myelements)
foreach(ref url; myUrls)
{
Task answer = runWorkerTaskH(&getServiceStatus, Task.getThis, url);
writefln("url: %s, status: %s", url.url, url.status);
}
}
void getServiceStatus(Task caller, MyUrl url) { // seems hiden copy accure
requestHTTP(url.url,
(scope req) {
req.method = HTTPMethod.GET;
},
(scope res) {
Json serviseAnswer = parseJsonString(res.bodyReader.readAllUTF8()); // status and message
url.status = serviseAnswer["status"].toString();
caller.send("goodbye");
//url.changeStatus(url.status);
}
);
}
Но после запуска я получаю сообщение об ошибке:
Running .\app.exe
[main(----) INF] Listening for requests on http://[::]:8080/
[main(----) INF] Listening for requests on http://0.0.0.0:8080/
processing
url: http://127.0.0.1:8081/hck, status:
url: http://127.0.0.1:8081/hck2, status:
url: http://127.0.0.1:8081/hck3, status:
object.Error@(0): Access Violation
----------------object.Error
@0x00538481(
00x0040B5D5)
: 0x00403B12
Access Violation0x0044D908
----------------
0x00403A1F0x00538481
0x0053B5390x0040B5D5
0xFFFFFFFF0x00403B12
0x7793F30C in RtlCaptureContext
0x0044D908
abnormal program termination
Program exited with code 1
Что я делаю не так?
Я не уверен, что правильно отлаживаю приложение, но:
logInfo("1111");
caller.send("goodbye");
logInfo("2222");
Напечатает:
[vibe-7(4hZL) INF] 1111
object.Error@(0): Access Violation
У меня есть идея, что setTimer
не создает задачу, и я всегда получаю null
. Но я не знаю, как это исправить.