digitalmars.D.learn - task can't take a class method
- helxi (90/90) Nov 19 2018 I want to create a task out of an object's method. My Class is:
- helxi (5/6) Nov 19 2018 Oh wait never mind I was missing a bracket:
- John Chapman (5/11) Nov 19 2018 You're attempting to execute "dd" at compile time. You should be
- helxi (2/3) Nov 19 2018 Thanks, that helped.
I want to create a task out of an object's method. My Class is:
public class Calldd
{
private:
const string tmpFileName = "/tmp/nixwriter.progress.txt";
string deviceName, sourceFileName;
public:
this(in string sourceFileName, in string deviceName)
{
this.sourceFileName = sourceFileName;
this.deviceName = deviceName;
}
int dd()
{
static ddcount = 0;
++ddcount;
scope (success)
--ddcount;
if (ddcount > 1)
return 1;
// Running dd again should be made impossible by the user
from the UI level
// I'm not making the code any more complicated
import std.format : format;
immutable string command = format("pkexec dd if=/%s of=%s
bs=4M status=progress 2>%s && sync",
sourceFileName, deviceName, tmpFileName);
return executeShell(command).status;
}
double parse()
{
import std.file : readText, getSize;
import std.string : splitLines, isNumeric;
import std.range : front, back, split;
import std.conv : to;
try
{
if (!(tmpFileName.exists))
return 0;
auto text = tmpFileName.readText();
if (text.splitLines().length == 0)
return 0;
if
(text.splitLines().back().split().front().isNumeric())
return text.splitLines().back().split().front()
.to!double * 100 / (getSize(sourceFileName));
}
catch (Exception e)
{
// Sanitize exceptions
}
return 0;
}
~this()
{
import std.file : exists, remove;
if (tmpFileName.exists())
remove(tmpFileName);
}
}
My call site:
trigger.addOnClicked(delegate void(Button _) {
// ...
auto sourceFileName = fcb.getFilename(),
deviceName =
parseDeviceName(deviceCombo.getActiveText());
auto ddCall = new Calldd(sourceFileName, deviceName);
import std.parallelism : task;
auto proc = task!ddCall.dd(); // <-- compilation
failure
proc.executeInNewThread();
});
The compiler says:
$ dub build
Performing "debug" build using /usr/bin/dmd for x86_64.
gtk-d:gtkd 3.8.3: target for configuration "library" is up to
date.
nixwriter ~master: building configuration "application"...
/usr/include/dlang/dmd/std/parallelism.d(507,34): Error: no
property opCall for type backend.Calldd, did you mean new Calldd?
/usr/include/dlang/dmd/std/parallelism.d(835,16): Error: template
instance `ui.PrimaryWindow.this.__dgliteral4.Task!(ddCall)` error
instantiating
source/ui.d(200,25): instantiated from here: task!(ddCall)
/usr/bin/dmd failed with exit code 1.
I gather that I have to define an OpCall for this. I thought
about calling the constructor inside the OpCall. But the ctor
needs two values itself. However the OpCall is being called
implicitly(?) somewhere. How can I get around this?
Note that the method dd() itself takes no params.
Nov 19 2018
On Monday, 19 November 2018 at 16:10:15 UTC, helxi wrote:...Oh wait never mind I was missing a bracket: auto proc = task!(ddCall.dd()); Now I have another thing to worry about: ddcall.dd() cannot be read at compile time.
Nov 19 2018
On Monday, 19 November 2018 at 16:29:01 UTC, helxi wrote:On Monday, 19 November 2018 at 16:10:15 UTC, helxi wrote:You're attempting to execute "dd" at compile time. You should be able to pass the function to a task in a couple of ways: 1) task(&ddCall.dd) 2) task!(ddCall.dd)...Oh wait never mind I was missing a bracket: auto proc = task!(ddCall.dd()); Now I have another thing to worry about: ddcall.dd() cannot be read at compile time.
Nov 19 2018
On Monday, 19 November 2018 at 17:18:14 UTC, John Chapman wrote:1) task(&ddCall.dd)Thanks, that helped.
Nov 19 2018








helxi <brucewayneshit gmail.com>