Загрузка базы данных?

мой вопрос: как я могу что-то сделать, пока я подключаюсь к базе данных MySQL? Чтобы было понятнее: допустим, я пытаюсь подключиться к базе данных:

db = MySQLdb.connect(host = "testhost",user ="testuser", passwd ="testpw", db = "testdb")

Ну, обычно, когда хост не является локальным, он обычно загружается немного, и пока это происходит, приложение «зависает» (я использую wxPython). Теперь я хочу, чтобы вместо «замораживания» отображалось что-то, что представляет «загрузку», это может быть изображение, текст, не имеет значения, вместо замораживания. Кроме того, как насчет заставок? Насколько я пытался, все, что мне удалось сделать, это несколько заставок, которые исчезают через время X и когда я нажимаю на них. Я действительно не знаю, как использовать его для загрузки ресурсов и, например, базы данных MySQL. В прошлый раз, когда я пытался загрузить базу данных MySQL с помощью заставки, она сначала загрузилась, а затем показала заставку (смеется). Спасибо.


person dpswt    schedule 20.03.2011    source источник
comment
Кстати, сохраните настройки базы данных в файле конфигурации вместо исходного кода вашей программы.   -  person jfs    schedule 20.03.2011
comment
Возможно, вы сможете избавиться от этой задержки, используя skip-name-resolve в конфигурации MySQL и подключившись к серверу по IP-адресу. Соединение должно быть почти мгновенным, если только оно не пытается разрешить имя хоста.   -  person robots.jpg    schedule 21.03.2011


Ответы (4)


Спасибо за вашу помощь, я пришел к ответу, более конкретному для wxPython. Я следовал этому простому примеру, чтобы заставить его работать:

import wx
import thread
from time import sleep

class MainFrame(wx.Frame):

    def __init__(self, parent):
        wx.Frame.__init__(self, parent)

        self.label = wx.StaticText(self, label="Ready")
        self.btn = wx.Button(self, label="Start")
        self.gauge = wx.Gauge(self)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.label, proportion=1, flag=wx.EXPAND)
        sizer.Add(self.btn, proportion=0, flag=wx.EXPAND)
        sizer.Add(self.gauge, proportion=0, flag=wx.EXPAND)

        self.SetSizerAndFit(sizer)

        self.Bind(wx.EVT_BUTTON, self.onButton)

    def onButton(self, evt):
        self.btn.Enable(False)
        self.gauge.SetValue(0)
        self.label.SetLabel("Running")
        thread.start_new_thread(self.longRunning, ())

    def onLongRunDone(self):
        self.gauge.SetValue(100)
        self.label.SetLabel("Done")
        self.btn.Enable(True)

    def longRunning(self):
        """This runs in a different thread.  Sleep is used to simulate a long running task."""
        sleep(3)
        wx.CallAfter(self.gauge.SetValue, 20)
        sleep(5)
        wx.CallAfter(self.gauge.SetValue, 50)
        sleep(1)
        wx.CallAfter(self.gauge.SetValue, 70)
        sleep(10)
        wx.CallAfter(self.onLongRunDone)

if __name__ == "__main__":
    app = wx.PySimpleApp()
    app.TopWindow = MainFrame(None)
    app.TopWindow.Show()
    app.MainLoop()

Отсюда: http://wiki.wxpython.org/LongRunningTasks, надеюсь, это поможет :).

person dpswt    schedule 20.03.2011

Если ваша программа должна делать две вещи одновременно, то использование нескольких потоков — хороший способ сделать это. В вашем случае у вас есть графический интерфейс, который вы хотели бы сохранить, и у вас есть база данных для подключения. Вам нужно выполнять работу с базой данных в отдельном потоке, а не в потоке, который обрабатывает события графического интерфейса; это будет поддерживать работу графического интерфейса во время установления соединения. Боюсь, я не могу рассказать вам, как писать многопоточный код на Python, но я думаю, что Google здесь ваш друг.

person Ernest Friedman-Hill    schedule 20.03.2011
comment
Да, мне просто нужна была идея, как я могу это сделать, поэтому я ценю ваш ответ! - person dpswt; 20.03.2011

Примеры того, как писать многопоточные программы Python с помощью модуля threading, см.

http://www.devshed.com/c/a/Python/Basic-Threading-in-Python/1/

и официальная документация:

http://docs.python.org/library/threading.html

person octagonC    schedule 20.03.2011

В этом случае многопоточность действительно поможет. ://themattreid.com/wordpress/2010/08/30/easy-python-threading-mysql-connections/

person jknair    schedule 20.03.2011