Skip to main content

undocumented - LibraryLink: Asynchronous Examples


Inside the directory structure of LibraryLink there are several example files. Basically, they are divided in two types:



  • Synchronous: demo.c, demo_error.c, demo_eval.c, demo_mathlink.c, demo_numerical.c, demo_shared.c, demo_string.c


  • Asynchronous: async-examples-libmain.c, async-tasks-oneshot.c, async-tasks-repeating.c, async-tasks-timing.c, async-tasks-without-thread.c


The synchronous examples are well documented and relatively easy to use. However, the asynchronous are undocumented (as far as I know) and more difficult to use. So far, after some guesswork, the best I could figure it out is the following:


File Description



  • async-examples-libmain.c: Initialization instructions (nothing to be executed within Mathematica).

  • async-tasks-oneshot.c: Example of how to execute a task one single time and then close it.

  • async-tasks-repeating.c: Example of how to execute a task continuously. This can be seen at the function IntBackgroundTask which has a while loop to keep the task alive.

  • async-tasks-timing.c: Example of how to execute a task with time constraint. This can be seen at the function IntBackgroundTask which has a for loop limited by an iterator.

  • async-tasks-without-thread.c: ????



File Structure
The main function of each one of the files is start_*_background_task and they are all very similar:



  • The arguments are the same as of the synchronous ones (ie: always 3 arguments).

  • The lines between mint asyncObjID; and asyncObjID = ioLibrary->createAsynchronousTaskWithThread(IntBackgroundTask, threadArg); sets and creates the asynchronous task.

  • MArgument_setInteger returns a value to Mathematica, currently is returning only the value of asyncObjID. However, more calculations could be copy & paste before this line.




1st Issue

My guesswork is correct? Did I miss something?


2nd Issue
What the example file async-tasks-without-thread.c do?


3rd Issue
I'm trying to create a library for each one of the aforementioned files but some of them are not working. For example, when I execute the following:


<< CCompilerDriver`
demoFile = First@FileNames["async-tasks-oneshot.c", {$InstallationDirectory}, Infinity];
lib = CreateLibrary[{demoFile}, "mylib"];

I receive the following error message:



CreateLibrary::cmperr: Compile error: C:\Program Files\Wolfram Research\Mathematica\9.0\SystemFiles\Links\LibraryLink\LibraryResources\Source\async-tasks-oneshot.c(5) : fatal error C1083: Cannot open include file: 'async-examples.h': No such file or directory >>

The same happens with "async-tasks-repeating.c" and "async-tasks-without-thread.c".


What is going on? How to fix it?


4th Issue
If I just load the library (instead of creating it), I also get some behaviours not understood yet. For example:


fun = LibraryFunctionLoad["async-tasks-oneshot", "start_int_background_task", {Integer, Integer}, Integer];
fun[0, 0]

Out[2]:=1


I was expecting the output to be asyncObjID due the line MArgument_setInteger(Res, asyncObjID). Why this is not the case?


5th Issue
Moreover, after calling this fun[0,0], I can not evaluate anything else. For example:


1+1

It stays in the evaluation queue forever, but never returns an answer. Why this is happening? How to properly call the asynchronous function fun?




ps: Anticipating some comments, I'm trying to use this asynchronous feature in order to solve an issue with Low Level Networking Programming.




Comments

Popular posts from this blog

plotting - Filling between two spheres in SphericalPlot3D

Manipulate[ SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, Mesh -> None, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], {n, 0, 1}] I cant' seem to be able to make a filling between two spheres. I've already tried the obvious Filling -> {1 -> {2}} but Mathematica doesn't seem to like that option. Is there any easy way around this or ... Answer There is no built-in filling in SphericalPlot3D . One option is to use ParametricPlot3D to draw the surfaces between the two shells: Manipulate[ Show[SphericalPlot3D[{1, 2 - n}, {θ, 0, Pi}, {ϕ, 0, 1.5 Pi}, PlotPoints -> 15, PlotRange -> {-2.2, 2.2}], ParametricPlot3D[{ r {Sin[t] Cos[1.5 Pi], Sin[t] Sin[1.5 Pi], Cos[t]}, r {Sin[t] Cos[0 Pi], Sin[t] Sin[0 Pi], Cos[t]}}, {r, 1, 2 - n}, {t, 0, Pi}, PlotStyle -> Yellow, Mesh -> {2, 15}]], {n, 0, 1}]

plotting - Plot 4D data with color as 4th dimension

I have a list of 4D data (x position, y position, amplitude, wavelength). I want to plot x, y, and amplitude on a 3D plot and have the color of the points correspond to the wavelength. I have seen many examples using functions to define color but my wavelength cannot be expressed by an analytic function. Is there a simple way to do this? Answer Here a another possible way to visualize 4D data: data = Flatten[Table[{x, y, x^2 + y^2, Sin[x - y]}, {x, -Pi, Pi,Pi/10}, {y,-Pi,Pi, Pi/10}], 1]; You can use the function Point along with VertexColors . Now the points are places using the first three elements and the color is determined by the fourth. In this case I used Hue, but you can use whatever you prefer. Graphics3D[ Point[data[[All, 1 ;; 3]], VertexColors -> Hue /@ data[[All, 4]]], Axes -> True, BoxRatios -> {1, 1, 1/GoldenRatio}]

plotting - Mathematica: 3D plot based on combined 2D graphs

I have several sigmoidal fits to 3 different datasets, with mean fit predictions plus the 95% confidence limits (not symmetrical around the mean) and the actual data. I would now like to show these different 2D plots projected in 3D as in but then using proper perspective. In the link here they give some solutions to combine the plots using isometric perspective, but I would like to use proper 3 point perspective. Any thoughts? Also any way to show the mean points per time point for each series plus or minus the standard error on the mean would be cool too, either using points+vertical bars, or using spheres plus tubes. Below are some test data and the fit function I am using. Note that I am working on a logit(proportion) scale and that the final vertical scale is Log10(percentage). (* some test data *) data = Table[Null, {i, 4}]; data[[1]] = {{1, -5.8}, {2, -5.4}, {3, -0.8}, {4, -0.2}, {5, 4.6}, {1, -6.4}, {2, -5.6}, {3, -0.7}, {4, 0.04}, {5, 1.0}, {1, -6.8}, {2, -4.7}, {3, -1.