ctypes and how to copy data passed to callback
Diez B. Roggisch
deets at nospam.web.de
Mon Jul 28 09:31:26 EDT 2008
waldek wrote:
> Hi,
>
> I'm trying to handle data passed to Py Callback which is called from
> C dll. Callback passes data to another thread using Queue module and
> there the data are printed out.
>
> If data is printed out in a callback itself it's ok. If I put on
> queue and next get from queue in another thread script prints some
> trash. Looks like the data is released when callback returned. I tired
> to make d = copy.deepcopy(data), but it does not work - I got nothing.
> Any idea why it's happening ?
>
> --------------------- main thread --------
> def callback(data, size):
> myqueue.put((data, size))
>
> mydll = cdll.MyDLL
> cbproto = CFUNCTYPE(c_int, POINTER(c_char), c_int)
> mycallback = cbproto(callback)
>
> mydll.RegisterCallback(mycallback)
>
> ---------------------------------- thread listener
> ----------------------
>
> while True:
> data, size = myqueue.get()
> print "***", data[:size]
>
> ------------------------------------------------------------------------------
You need to allocate e.g. a bytebuffer using ctypes and then copy the memory
area you get passed into that buffer.
Otherwise I presume whoever invokes the callback releases the originaly
memory block after the callback terminated.
Diez
More information about the Python-list
mailing list