سؤال

ولدي التطبيق GUI الثعبان يستخدم دالة تشغيل طويلة. لذا من /. DLL أنه يدعو من خلال ctypes.

وأنا أبحث عن وسيلة للتواصل مع وظيفة في حين انها تعمل في موضوع مستقل أو العملية، حتى أستطيع أن تطلب ذلك لإنهاء مبكر (الذي يتطلب بعض العمل على الجانب C قبل إرجاع نتيجة جزئية). اعتقد ان هذا سوف تحتاج نوعا من تلقي إشارة أو القراءة من الأنابيب، ولكن أريد أن يبقيه بسيطة بقدر الإمكان.

وماذا عليك أن تنظر في أفضل طريقة لحل هذا النوع من المشاكل؟ وأنا قادرة على تغيير رمز على كل من الثعبان وجوانب C.

هل كانت مفيدة؟

المحلول

وهناك قسمين ستحتاج إلى الإجابة هنا: واحد اذا كيفية التواصل بين العمليتين (GUI وعملية تنفيذ وظيفة)، والآخر هو كيفية تغيير وظيفة بحيث يستجيب لطلبات غير متزامن ( "أوه، لقد قيل لي لمجرد العودة مهما عندي").

وسوف تعمل من الإجابة على السؤال الثاني ربما تملي الجواب عن السؤال الأول. يمكنك أن تفعل ذلك بواسطة إشارات (وفي هذه الحالة تحصل على معالج إشارة إلى أن يحصل على السيطرة على هذه العملية، يمكن أن ننظر للحصول على تعليمات أكثر تفصيلا في أي مكان آخر، وتغيير هياكل البيانات الداخلية الخاصة بك قبل أن تعود السيطرة إلى وظيفة الخاص بك)، أو هل يمكن أن يكون وظيفة الخاص بك مراقبة واجهة التحكم لأوامر (كل جزء من الثانية، تحقق لمعرفة ما إذا كان هناك انتظار الأوامر، وإذا كان هناك، ونرى ما هو عليه).

في الحالة الأولى، وكنت تريد ANSI C إشارة التعامل مع (إشارة ()، sighandler_t)، في الثانية كنت ربما ترغب في الأنابيب أو ما شابه ذلك (الأنابيب () وحدد ()).

نصائح أخرى

ولقد ذكرتم أنه يمكنك تغيير كل من C وجوانب بيثون. لتجنب الحاجة إلى كتابة أي مآخذ أو رمز إشارة في C، قد يكون من الأسهل لتفريق ظيفة C الكبيرة إلى 3 وظائف منفصلة أصغر تؤدي الإعداد، قطعة صغيرة من العمل، وتنظيف. يجب أن يكون الطرد العمل بين حوالي 1 مللي و 1 ثانية وقت التشغيل إلى تحقيق توازن بين الاستجابة وانخفاض النفقات العامة. يمكن أن يكون صعبا لتفريق الحسابات حتى إلى قطع مثل هذا في مواجهة تغيير أحجام البيانات، ولكن سيكون لديك نفس التحدي في وظيفة واحدة كبيرة أن فعلت أيضا I / O.

وكتابة العملية المنفذة في بيثون أن يدعو تلك الوظائف من 3 إلى ctypes. لدينا عملية عامل الاختيار الكائن انتظار للحصول على رسالة من واجهة المستخدم الرسومية لوقف الحساب مبكرا. تأكد من استخدام الدعوة Queue.get_nowait عدم عرقلة بدلا من Queue.get. إذا وجدت العملية المنفذة رسالة لإنهاء وقت مبكر، واستدعاء C تنظيف رمز وإرجاع نتيجة جزئية.

إذا كنت على * لا شىء تسجيل معالج إشارة لSIGUSR1 أو SIGINT في برنامج C الخاص بك، ثم من بيثون استخدام os.kill لإرسال إشارة.

ولقد قلت ذلك: الإشارات وأنابيب

وليس من الضروري أن تكون معقدة جدا، ولكن سيكون من هيك أسهل كثيرا إذا كنت تستخدم الهيكل الحالي مما لو كنت في محاولة للفة بنفسك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top