[Python-checkins] python/dist/src/Modules _tkinter.c,1.137,1.138

loewis@users.sourceforge.net loewis@users.sourceforge.net
2002年12月28日 01:23:12 -0800


Update of /cvsroot/python/python/dist/src/Modules
In directory sc8-pr-cvs1:/tmp/cvs-serv27575/Modules
Modified Files:
	_tkinter.c 
Log Message:
Gracefully delay runtime error up to 1s. Add .willdispatch().
Index: _tkinter.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Modules/_tkinter.c,v
retrieving revision 1.137
retrieving revision 1.138
diff -C2 -d -r1.137 -r1.138
*** _tkinter.c	12 Dec 2002 19:05:48 -0000	1.137
--- _tkinter.c	28 Dec 2002 09:23:09 -0000	1.138
***************
*** 311,314 ****
--- 311,332 ----
 #endif /* WITH_THREAD */
 
+ /* Wait up to 1s for the mainloop to come up. */
+ 
+ static int
+ WaitForMainloop(TkappObject* self)
+ {
+ 	int i;
+ 	for (i = 0; i < 10; i++) {
+ 		if (self->dispatching)
+ 			return 1;
+ 		Py_BEGIN_ALLOW_THREADS
+ 		Sleep(100);
+ 		Py_END_ALLOW_THREADS
+ 	}
+ 	if (self->dispatching)
+ 		return 1;
+ 	PyErr_SetString(PyExc_RuntimeError, "main thread is not in main loop");
+ 	return 0;
+ }
 
 
***************
*** 1139,1147 ****
 		Tkapp_CallEvent *ev;
 		PyObject *exc_type, *exc_value, *exc_tb;
! 		if (!self->dispatching) {
! 			PyErr_SetString(PyExc_RuntimeError,
! 					"main thread is not in main loop");
 			return NULL;
- 		}
 		ev = (Tkapp_CallEvent*)ckalloc(sizeof(Tkapp_CallEvent));
 		ev->ev.proc = (Tcl_EventProc*)Tkapp_CallProc;
--- 1157,1162 ----
 		Tkapp_CallEvent *ev;
 		PyObject *exc_type, *exc_value, *exc_tb;
! 		if (!WaitForMainloop(self))
 			return NULL;
 		ev = (Tkapp_CallEvent*)ckalloc(sizeof(Tkapp_CallEvent));
 		ev->ev.proc = (Tcl_EventProc*)Tkapp_CallProc;
***************
*** 1428,1436 ****
 		 completion. */
 
! 		if (!self->dispatching) {
! 			PyErr_SetString(PyExc_RuntimeError, 
! 					"main thread is not in main loop");
 			return NULL;
- 		}
 		ev->cond = NULL;
 		ev->ev.proc = (Tcl_EventProc*)var_proc;
--- 1443,1448 ----
 		 completion. */
 
! 		if (!WaitForMainloop(self))
 			return NULL;
 		ev->cond = NULL;
 		ev->ev.proc = (Tcl_EventProc*)var_proc;
***************
*** 1944,1952 ****
 
 	if (self->threaded && self->thread_id != Tcl_GetCurrentThread() &&
! 	 !self->dispatching) {
! 		PyErr_SetString(PyExc_RuntimeError, 
! 				"main thread is not in main loop");
 		return NULL;
- 	}
 
 	data = PyMem_NEW(PythonCmd_ClientData, 1);
--- 1956,1961 ----
 
 	if (self->threaded && self->thread_id != Tcl_GetCurrentThread() &&
! 	 !WaitForMainloop(self))
 		return NULL;
 
 	data = PyMem_NEW(PythonCmd_ClientData, 1);
***************
*** 2424,2427 ****
--- 2433,2445 ----
 }
 
+ static PyObject *
+ Tkapp_WillDispatch(PyObject *self, PyObject *args)
+ {
+ 
+ 	((TkappObject*)self)->dispatching = 1;
+ 
+ 	Py_INCREF(Py_None);
+ 	return Py_None;
+ }
 
 
***************
*** 2430,2433 ****
--- 2448,2452 ----
 static PyMethodDef Tkapp_methods[] =
 {
+ 	{"willdispatch", Tkapp_WillDispatch, METH_NOARGS},
 	{"wantobjects",	 Tkapp_WantObjects, METH_VARARGS},
 	{"call", 	 Tkapp_Call, METH_OLDARGS},

AltStyle によって変換されたページ (->オリジナル) /