Hi,all

I try to callback from a thread in C. But it collapsed. I can't figure
it out.
My test files attached.
Thanks.
#include <windows.h>
#include "Python.h"
#include <stdio.h>

static PyObject *my_callback = NULL;
DWORD threadId;
HANDLE thread;


static PyObject *
callback_set_callback(PyObject *dummy, PyObject *args)
{
    PyObject *result = NULL;
    PyObject *temp;
    
    if (PyArg_ParseTuple(args, "O:set_callback", &temp))
    {
        if (!PyCallable_Check(temp))
        {
            PyErr_SetString(PyExc_TypeError, "Must be callable");
            return NULL;
        }

        my_callback = temp;
        Py_XINCREF(temp);
        Py_XDECREF(my_callback);
        Py_INCREF(Py_None);
        result = Py_None;
    }
    return result;
}


PyObject* Test()
{
    PyObject *result;
    PyObject *arglist;

    int i = 0;
    for (; i<10; ++i)
    {
       printf("Callback from Test()\n");
       arglist = Py_BuildValue("(i)", i*i);
       result = PyEval_CallObject(my_callback, arglist);
       Py_DECREF(arglist);
    }
   
   return result;
}


static PyObject *
callback_test(PyObject *dummy, PyObject *args)
{
    thread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&Test, NULL, 0, 
&threadId);
    //FIXME
    //WaitForMultipleObjects(1, &thread, TRUE, INFINITE);
    //
    return Py_BuildValue("b", TRUE);
}


static PyMethodDef CameraModuleMethods[] = 
{
    {"Test", callback_test, METH_NOARGS, "Test"},
    {"SetCallback", callback_set_callback, METH_VARARGS, "Set callback func"},
    {NULL, NULL, 0, NULL}
};


void initCallbackTest(void)
{
    Py_InitModule("CallbackTest", CameraModuleMethods);
};


#
# usage: python setup.py install
#


from distutils.core import setup, Extension

my_module = Extension("CallbackTest", 
                      sources=['callback.c'])

setup(name="CallbackTest", version="1.0",
      ext_modules=[my_module])

import CallbackTest as cb
import time

def print_msg(long_number):
    print ">>>>>>>>> " * 3, long_number
    return True

cb.SetCallback(print_msg)
cb.Test()

time.sleep(1)

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to