Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 26, 2012 12:34:31

nauman
От:
Зарегистрирован: 2009-10-28
Сообщения: 50
Репутация: +  0  -
Профиль   Отправить e-mail  

запуск потока из потока

Нужна вваша помощь, есть следующая задумка: серверный скрипт, при получении сообщения должен показать его на экране монитора, для этого воспользовался wx модулем. Но при этом возникает следующая проблема, пока не закроешь окно с сообщением, новое не появится. Эту проблем я решил запуском функции отображения окна в отдельном потоке, но порожденном из другого потока который слушает и получает текстовые сообщения от клиента. В принципе все заработало как надо, но Винду, в отличии от Убунту, этот сценарий не устраивает и она сообщает:
python.exe - обнаружена ошибка. Приложение будет закрыто. Приносим извинения за неудобства., а
В общем, как можно решить эту проблему?
Серверный скрипт:

#!/usr/bin/python
#-*- coding: UTF-8 -*-
import os, sys, time, wx, socket, threading
def show_mes(text):
    #создаем окно с текстовым сообщением
    class InsertFrame(wx.Frame):
        def __init__(self, parent, id=-1):
            wx.Frame.__init__(self, parent, id, 'Server info',pos=(1480,1070),
                size=(370, 80), style=(wx.DEFAULT_FRAME_STYLE ^ (wx.RESIZE_BORDER | wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.SIMPLE_BORDER)))
            panel = wx.Panel(self)
            info = text.decode('utf-8')
            pnl = wx.Panel(self, -1, size=(370, 80), style=wx.NO_BORDER)
            st1 = wx.TextCtrl(pnl, -1, info, size=(370, 80), style=wx.ALIGN_LEFT | wx.TE_WORDWRAP | wx.TE_READONLY 
            | wx.TE_RICH2)
            #st1.SetBackgroundColour("Yellow")
        def OnCloseMe(self, event):
            self.Close(True)
        def OnCloseWindow(self, event):
            self.Destroy()
    if __name__ == '__main__':
        app = wx.PySimpleApp()
        frame = InsertFrame(parent=None, id=-1)
        frame.Show()
        app.MainLoop()
class MyThread(threading.Thread):
    def run (self):
        show_mes(text)
class GetTextThread(threading.Thread):
    def run (self):
        get_text()
def get_text(): #получам сообщение от клиента
    global text
    while True:
        conn, addr = s.accept()
        text = conn.recv(1448)
        conn.close()
        #создаем новый поток для вывода окна с сообщением
        #иначе функция ожидает закрытия окна
        thrd = MyThread()
        thrd.start()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(('', 3036))
s.listen(300)
get_text_thread = GetTextThread()
get_text_thread.start()
На всякий случай клиент:
import os, socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 3036))
s.sendall("some info")
s.close()
Моя конфигурация: Python 2.7, Win XP SP3
С wx знаком поверхностно.



Отредактировано nauman (Окт. 26, 2012 12:38:49)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version