¡¡¡¡Qt ×÷ΪһÖÖ»ùÓÚ C++ µÄ¿çƽ̨ GUI ϵͳ£¬Äܹ»Ìṩ¸øÓû§¹¹ÔìͼÐÎÓû§½çÃæµÄÇ¿´ó¹¦ÄÜ¡£ÎªÁËÂú×ãÓû§¹¹Ô츴ÔÓͼÐνçÃæϵͳµÄÐèÇó£¬Qt ÌṩÁ˷ḻµÄ¶àÏ̱߳à³ÌÖ§³Ö¡£
¡¡¡¡
¡¡¡¡Qt ×÷ΪһÖÖ»ùÓÚ C++ µÄ¿çƽ̨ GUI ϵͳ£¬Äܹ»Ìṩ¸øÓû§¹¹ÔìͼÐÎÓû§½çÃæµÄÇ¿´ó¹¦ÄÜ¡£ÎªÁËÂú×ãÓû§¹¹Ô츴ÔÓͼÐνçÃæϵͳµÄÐèÇó£¬Qt ÌṩÁ˷ḻµÄ¶àÏ̱߳à³ÌÖ§³Ö¡£´Ó 2.2 °æ±¾¿ªÊ¼£¬Qt Ö÷Òª´ÓÏÂÃæÈý¸ö·½Ãæ¶Ô¶àÏ̱߳à³ÌÌṩ֧³Ö£ºÒ»¡¢¹¹ÔìÁËһЩ»ù±¾µÄÓëƽ̨Î޹صÄÏß³ÌÀࣻ¶þ¡¢Ìá½»Óû§×Ô¶¨ÒåʼþµÄ Thread-safe ·½Ê½£»Èý¡¢¶àÖÖÏ̼߳äͬ²½»úÖÆ£¬ÈçÐźÅÁ¿£¬È«¾ÖËø¡£ÕâЩ¶¼¸øÓû§ÌṩÁ˼«´óµÄ·½±ã¡£²»¹ý£¬ÔÚijЩÇé¿öÏ£¬Ê¹Óö¨Ê±Æ÷»úÖÆÄܹ»±ÈÀûÓà Qt ±¾ÉíµÄ¶àÏ̻߳úÖƸü·½±ãµØʵÏÖËùÐèÒªµÄ¹¦ÄÜ£¬Í¬Ê±Ò²±ÜÃâÁ˲»°²È«µÄÏÖÏó·¢Éú¡£±¾ÎIJ»½ö¶Ô Qt ÖеĶàÏß³ÌÖ§³Ö»úÖƽøÐÐÁËÌÖÂÛ£¬»¹×ÅÖØ̽ÌÖÁËÀûÓö¨Ê±Æ÷»úÖÆÄ£Äâ¶àÏ̱߳à³ÌµÄ·½·¨¡£
¡¡¡¡
¡¡¡¡1¡¢ÏµÍ³¶Ô¶àÏ̱߳à³ÌµÄÖ§³Ö
¡¡¡¡²»Í¬µÄƽ̨¶Ô Qt µÄ¶àÏß³ÌÖ§³Ö·½Ê½ÊDz»Í¬µÄ¡£µ±Óû§ÔÚ Windows ²Ù×÷ϵͳÉÏ°²×° Qt ϵͳʱ£¬Ïß³ÌÖ§³ÖÊDZàÒëÆ÷µÄÒ»¸öÑ¡ÏÔÚ Qt µÄ mkfiles ×ÓĿ¼ÖаüÀ¨Á˲»Í¬ÖÖÀà±àÒëÆ÷µÄ±àÒëÎļþ£¬ÆäÖдøÓÐ -mt ºó׺µÄÎļþ²ÅÊÇÖ§³Ö¶àÏ̵߳ġ£
¡¡¡¡
¡¡¡¡¶øÔÚ Unix ²Ù×÷ϵͳÖУ¬Ï̵߳ÄÖ§³ÖÊÇͨ¹ýÔÚÔËÐÐ configure ½Å±¾ÎļþʱÌí¼Ó -thread Ñ¡Ïî¼ÓÈëµÄ¡£°²×°¹ý³Ì½«´´½¨Ò»¸ö¶ÀÁ¢µÄ¿â£¬¼´ libqt-mt£¬Òò´ËÒªÖ§³Ö¶àÏ̱߳à³Ìʱ£¬±ØÐëÓë¸Ã¿âÁ´½Ó£¨Á´½ÓÑ¡ÏîΪ-lqt-mt£©£¬¶ø²»ÊÇÓëͨ³£µÄ Qt ¿â£¨-lqt£©Á´½Ó¡£
¡¡¡¡
¡¡¡¡ÁíÍ⣬ÎÞÂÛÊǺÎÖÖƽ̨£¬ÔÚÔö¼ÓÏß³ÌÖ§³Öʱ¶¼ÐèÒª¶¨Òåºê QT_THREAD_SUPPORT£¨¼´Ôö¼Ó±àÒëÑ¡Ïî-DQT_THREAD_SUPPORT£©¡£ÔÚ Windows ²Ù×÷ϵͳÖУ¬ÕâÒ»µãͨ³£ÊÇÔÚ qconfig.h ÎļþÖÐÔö¼ÓÒ»¸öÑ¡ÏîÀ´ÊµÏֵġ£¶øÔÚ Unix ϵͳÖÐͨ³£Ìí¼ÓÔÚÓÐ¹ØµÄ Makefile ÎļþÖС£
¡¡¡¡
¡¡¡¡2¡¢QtÖеÄÏß³ÌÀà
¡¡¡¡ÔÚ Qt ϵͳÖÐÓëÏß³ÌÏà¹ØµÄ×îÖØÒªµÄÀ൱ȻÊÇ QThread À࣬¸ÃÀàÌṩÁË´´½¨Ò»¸öÐÂÏß³ÌÒÔ¼°¿ØÖÆÏß³ÌÔËÐеĸ÷ÖÖ·½·¨¡£Ïß³ÌÊÇͨ¹ý QThread::run() ÖØÔغ¯Êý¿ªÊ¼Ö´Ðеģ¬ÕâÒ»µãºÜÏó Java ÓïÑÔÖеÄÏß³ÌÀà¡£ÔÚ Qt ϵͳÖУ¬Ê¼ÖÕÔËÐÐ×ÅÒ»¸öGUI Ö÷ʼþỊ̈߳¬Õâ¸öÖ÷Ï̴߳Ӵ°¿ÚϵͳÖлñȡʼþ£¬²¢½«ËüÃÇ·Ö·¢µ½¸÷¸ö×é¼þÈ¥´¦Àí¡£ÔÚ QThread ÀàÖл¹ÓÐÒ»ÖÖ´Ó·ÇÖ÷ʼþÏß³ÌÖн«Ê¼þÌá½»¸øÒ»¸ö¶ÔÏóµÄ·½·¨£¬Ò²¾ÍÊÇ QThread::postEvent()·½·¨£¬¸Ã·½·¨ÌṩÁË Qt ÖеÄÒ»ÖÖ Thread-safe µÄʼþÌá½»¹ý³Ì¡£Ìá½»µÄʼþ±»·Å½øÒ»¸ö¶ÓÁÐÖУ¬È»ºó GUI Ö÷ʼþÏ̱߳»»½ÐѲ¢½«´Ëʼþ·¢¸øÏàÓ¦µÄ¶ÔÏó£¬Õâ¸ö¹ý³ÌÓëÒ»°ãµÄ´°¿Úϵͳʼþ´¦Àí¹ý³ÌÊÇÒ»ÑùµÄ¡£ÖµµÃ×¢ÒâµÄÊÇ£¬µ±Ê¼þ´¦Àí¹ý³Ì±»µ÷ÓÃʱ£¬ÊÇÔÚÖ÷ʼþÏß³ÌÖб»µ÷Óõģ¬¶ø²»ÊÇÔÚµ÷ÓÃQThread::postEvent ·½·¨µÄÏß³ÌÖб»µ÷ÓᣱÈÈçÓû§¿ÉÒÔ´ÓÒ»¸öÏß³ÌÖÐÆÈʹÁíÒ»¸öÏß³ÌÖػָ¶¨ÇøÓò£º
¡¡¡¡
¡¡¡¡QWidget *mywidget;
¡¡¡¡QThread::postEvent(mywidget, new QPaintEvent(QRect(0,0,100,100)));
¡¡¡¡
¡¡¡¡È»¶ø£¬Ö»ÓÐÒ»¸öÏß³ÌÀàÊDz»¹»µÄ£¬Îª±àд³öÖ§³Ö¶àÏ̵߳ijÌÐò£¬»¹ÐèҪʵÏÖÁ½¸ö²»Í¬µÄÏ̶߳Թ²ÓÐÊý¾ÝµÄ»¥³â·ÃÎÊ£¬Òò´Ë Qt »¹ÌṩÁË QMutex À࣬һ¸öÏß³ÌÔÚ·ÃÎÊÁÙ½çÊý¾Ýʱ£¬ÐèÒª¼ÓËø£¬´ËʱÆäËûÏß³ÌÊÇÎÞ·¨¶Ô¸ÃÁÙ½çÊý¾Ýͬʱ¼ÓËøµÄ£¬Ö±µ½Ç°Ò»¸öÏß³ÌÊͷŸÃÁÙ½çÊý¾Ý¡£Í¨¹ýÕâÖÖ·½Ê½²ÅÄÜʵÏÖ¶ÔÁÙ½çÊý¾ÝµÄÔ×Ó²Ù×÷¡£
¡¡¡¡
¡¡¡¡³ý´ËÖ®Í⣬»¹ÐèҪһЩ»úÖÆʹµÃ´¦Óڵȴý״̬µÄÏß³ÌÔÚÌض¨Çé¿öϱ»»½ÐÑ¡£QWaitCondition Àà¾ÍÌṩÁËÕâÖÖ¹¦ÄÜ¡£µ±·¢ÉúÌض¨Ê¼þʱ£¬QWaitCondition ½«»½Ðѵȴý¸ÃʼþµÄËùÓÐÏ̻߳òÕß»½ÐÑÈÎÒâÒ»¸ö±»Ñ¡ÖеÄÏ̡߳£
¡¡¡¡
¡¡¡¡3¡¢Óû§×Ô¶¨ÒåʼþÔÚ¶àÏ̱߳à³ÌÖеÄÓ¦ÓÃ
¡¡¡¡ÔÚ Qt ϵͳÖУ¬¶¨ÒåÁ˺ܶàÖÖÀàµÄʼþ£¬È綨ʱÆ÷ʼþ¡¢Êó±êÒƶ¯Ê¼þ¡¢¼üÅÌʼþ¡¢´°¿Ú¿Ø¼þʼþµÈ¡£Í¨³££¬Ê¼þ¶¼À´×ԵײãµÄ´°¿Úϵͳ£¬Qt µÄÖ÷ʼþÑ»·º¯Êý´ÓϵͳµÄʼþ¶ÓÁÐÖлñÈ¡ÕâЩʼþ£¬²¢½«ËüÃÇת»»Îª QEvent£¬È»ºó´«¸øÏàÓ¦µÄ QObjects ¶ÔÏó¡£
¡¡¡¡
¡¡¡¡³ý´ËÖ®Í⣬ΪÁËÂú×ãÓû§µÄÐèÇó£¬Qt ϵͳ»¹ÌṩÁËÒ»¸ö QCustomEvent À࣬ÓÃÓÚÓû§×Ô¶¨Òåʼþ£¬ÕâЩ×Ô¶¨Òåʼþ¿ÉÒÔÀûÓà QThread::postEvent() »òÕßQApplication::postEvent() ±»·¢¸ø¸÷Öֿؼþ»òÆäËû QObject ʵÀý£¬¶ø QWidget ÀàµÄ×ÓÀà¿ÉÒÔͨ¹ý QWidget::customEvent() ʼþ´¦Àíº¯Êý·½±ãµØ½ÓÊÕµ½ÕâЩ×Ô¶¨ÒåµÄʼþ¡£ÐèҪעÒâµÄÊÇ£ºQCustomEvent ¶ÔÏóÔÚ´´½¨Ê±¶¼´øÓÐÒ»¸öÀàÐͱêʶ id ÒÔ¶¨ÒåʼþÀàÐÍ£¬ÎªÁ˱ÜÃâÓë Qt ϵͳ¶¨ÒåµÄʼþÀàÐͳåÍ»£¬¸Ã id ÖµÓ¦¸Ã´óÓÚö¾ÙÀàÐÍ QEvent::Type Öиø³öµÄ "User" Öµ¡£
¡¡¡¡
¡¡¡¡ÔÚÏÂÃæµÄÀý×ÓÖУ¬ÏÔʾÁ˶àÏ̱߳à³ÌÖÐÈçºÎÀûÓÃÓû§×Ô¶¨ÒåʼþÀà¡£
¡¡¡¡
¡¡¡¡UserEventÀàÊÇÓû§×Ô¶¨ÒåµÄʼþÀ࣬Æäʼþ±êʶΪ346798£¬ÏÔÈ»²»»áÓëϵͳ¶¨ÒåµÄʼþÀàÐͳåÍ»¡£
¡¡¡¡
¡¡¡¡class UserEvent : public QCustomEvent¡¡ //Óû§×Ô¶¨ÒåµÄʼþÀà
¡¡¡¡{
¡¡¡¡public:
¡¡¡¡ UserEvent(QString s) : QCustomEvent(346798), sz(s) { ; }
¡¡¡¡ QString str() const { return sz; }
¡¡¡¡private:
¡¡¡¡ QString sz;¡¡¡¡
¡¡¡¡};
¡¡¡¡
¡¡¡¡UserThreadÀàÊÇÓÉQThreadÀà¼Ì³Ð¶øÀ´µÄ×ÓÀ࣬ÔÚ¸ÃÀàÖгýÁ˶¨ÒåÓйصıäÁ¿ºÍÏ߳̿ØÖƺ¯ÊýÍ⣬×îÖ÷ÒªµÄÊǶ¨ÒåÏ̵߳ÄÆô¶¯º¯ÊýUserThread::run()£¬Ôڸú¯ÊýÖд´½¨ÁËÒ»¸öÓû§×Ô¶¨ÒåʼþUserEvent£¬²¢ÀûÓÃQThreadÀàµÄpostEventº¯ÊýÌá½»¸Ãʼþ¸øÏàÓ¦µÄ½ÓÊÕ¶ÔÏó¡£
¡¡¡¡
¡¡¡¡class UserThread : public QThread¡¡¡¡¡¡//Óû§¶¨ÒåµÄÏß³ÌÀà
¡¡¡¡{
¡¡¡¡public:
¡¡¡¡ UserThread(QObject *r, QMutex *m, QWaitCondition *c);
¡¡¡¡QObject *receiver;
¡¡¡¡}
¡¡¡¡
¡¡¡¡void UserThread::run()¡¡¡¡ //Ïß³ÌÀàÆô¶¯º¯Êý£¬Ôڸú¯ÊýÖд´½¨ÁËÒ»¸öÓû§×Ô¶¨Òåʼþ
¡¡¡¡{UserEvent *re = new UserEvent(resultstring);
¡¡¡¡ ¡¡QThread::postEvent(receiver, re);
¡¡¡¡}
¡¡¡¡
¡¡¡¡UserWidgetÀàÊÇÓû§¶¨ÒåµÄÓÃÓÚ½ÓÊÕ×Ô¶¨ÒåʼþµÄQWidgetÀàµÄ×ÓÀ࣬¸ÃÀàÀûÓÃslotGo()º¯Êý´´½¨ÁËÒ»¸öеÄÏß³Ìrecv£¨UserThreadÀࣩ£¬µ±ÊÕµ½ÏàÓ¦µÄ×Ô¶¨Òåʼþ£¨¼´idΪ346798£©Ê±£¬ÀûÓÃcustomEventº¯Êý¶Ôʼþ½øÐд¦Àí¡£
¡¡¡¡
¡¡¡¡void UserWidget::slotGo()¡¡¡¡//Óû§¶¨Òå¿Ø¼þµÄ³ÉÔ±º¯Êý
¡¡¡¡{ mutex.lock();¡¡
¡¡¡¡ if (! recv)
¡¡¡¡ recv = new UserThread(this, &mutex, &condition);
¡¡¡¡ recv->start();
¡¡¡¡ mutex.unlock();
¡¡¡¡}
¡¡¡¡
¡¡¡¡void UserWidget::customEvent(QCustomEvent *e)¡¡ //Óû§×Ô¶¨Òåʼþ´¦Àíº¯Êý
¡¡¡¡{ if (e->type()==346798)
¡¡¡¡ {
¡¡¡¡ UserEvent *re = (UserEvent *) e;
¡¡¡¡¡¡¡¡¡¡¡¡newstring = re->str();
¡¡¡¡¡¡¡¡}
¡¡¡¡}
¡¡¡¡
¡¡¡¡ÔÚÕâ¸öÀý×ÓÖУ¬UserWidget¶ÔÏóÖд´½¨ÁËеÄÏß³ÌUserThread£¬Óû§¿ÉÒÔÀûÓÃÕâ¸öÏß³ÌʵÏÖһЩÖÜÆÚÐԵĴ¦Àí£¨Èç½ÓÊյײ㷢À´µÄÏûÏ¢µÈ£©£¬Ò»µ©Âú×ãÌض¨Ìõ¼þ¾ÍÌá½»Ò»¸öÓû§×Ô¶¨ÒåµÄʼþ£¬µ±UserWidget¶ÔÏóÊÕµ½¸Ãʼþʱ£¬¿ÉÒÔ°´ÐèÇó×ö³öÏàÓ¦µÄ´¦Àí£¬¶øÒ»°ãÇé¿öÏ£¬UserWidget¶ÔÏó¿ÉÒÔÕý³£µØÖ´ÐÐijЩÀýÐд¦Àí£¬¶øÍêÈ«²»ÊܵײãÏûÏ¢µÄÓ°Ïì¡£
¡¡¡¡
¡¡¡¡4¡¢ÀûÓö¨Ê±Æ÷»úÖÆʵÏÖ¶àÏ̱߳à³Ì
¡¡¡¡ÎªÁ˱ÜÃâQtϵͳÖжàÏ̱߳à³Ì´øÀ´µÄÎÊÌ⣬»¹¿ÉÒÔʹÓÃϵͳÖÐÌṩµÄ¶¨Ê±Æ÷»úÖÆÀ´ÊµÏÖÀàËƵŦÄÜ¡£¶¨Ê±Æ÷»úÖƽ«²¢·¢µÄʼþ´®Ðл¯£¬¼ò»¯Á˶Բ¢·¢Ê¼þµÄ´¦Àí£¬´Ó¶ø±ÜÃâÁËthread-safe·½ÃæÎÊÌâµÄ³öÏÖ¡£
¡¡¡¡
¡¡¡¡ÔÚÏÂÃæµÄÀý×ÓÖУ¬Í¬Ê±ÓÐÈô¸É¸ö¶ÔÏóÐèÒª½ÓÊյײ㷢À´µÄÏûÏ¢£¨¿ÉÒÔͨ¹ýSocket¡¢FIFOµÈ½ø³Ì¼äͨÐÅ»úÖÆ£©£¬¶øÏûÏ¢ÊÇËæ»úÊÕµ½µÄ£¬ÐèÒªÓÐÒ»¸öGUIÖ÷Ïß³ÌרߺÔð½ÓÊÕÏûÏ¢¡£µ±ÊÕµ½ÏûϢʱÖ÷Ï̳߳õʼ»¯ÏàÓ¦¶ÔÏóʹ֮¿ªÊ¼´¦Àí£¬Í¬Ê±·µ»Ø£¬ÕâÑùÖ÷Ï߳̾ͿÉÒÔʼÖÕ¸üнçÃæÏÔʾ²¢½ÓÊÕÍâ½ç·¢À´µÄÏûÏ¢£¬´ïµ½Í¬Ê±¶Ô¶à¸ö¶ÔÏóµÄ¿ØÖÆ£»ÁíÒ»·½Ã棬¸÷¸ö¶ÔÏóÔÚ´¦ÀíÍêÏûÏ¢ºóÐèҪ֪ͨGUIÖ÷Ï̡߳£¶ÔÓÚÕâ¸öÎÊÌ⣬¿ÉÒÔÀûÓõÚ3½ÚÖеÄÓû§×Ô¶¨ÒåʼþµÄ·½·¨£¬ÔÚÖ÷Ïß³ÌÖа²×°Ò»¸öʼþ¹ýÂËÆ÷£¬À´²¶×½´Ó¸÷¸ö¶ÔÏóÖз¢À´µÄ×Ô¶¨Òåʼþ£¬È»ºó·¢³öÐźŵ÷ÓÃÖ÷Ïß³ÌÖеÄÒ»¸ö²Ûº¯Êý¡£
¡¡¡¡
¡¡¡¡ÁíÍ⣬Ҳ¿ÉÒÔÀûÓÃQtÖеĶ¨Ê±Æ÷»úÖÆʵÏÖÀàËƵŦÄÜ£¬¶øÓÖ²»±Øµ£ÐÄThread-safeÎÊÌâ¡£ÏÂÃæ¾ÍÊÇÓйصĴúÂ벿·Ö£º
¡¡¡¡
¡¡¡¡ÔÚÓû§¶¨ÒåµÄServerÀàÖд´½¨ºÍÆô¶¯Á˶¨Ê±Æ÷£¬²¢ÀûÓÃconnectº¯Êý½«¶¨Ê±Æ÷³¬Ê±Óë¶ÁÈ¡É豸ÎļþÊý¾ÝÏà¹ØÁª£º
¡¡¡¡
¡¡¡¡Server:: Server(QWidget *parent) : QWidget(parent)
¡¡¡¡{
¡¡¡¡readTimer = new QTimer(this);¡¡ //´´½¨²¢Æô¶¯¶¨Ê±Æ÷
¡¡¡¡¡¡ connect(readTimer, SIGNAL(timeout()), this, SLOT(slotReadFile()));¡¡ //ÿµ±¶¨Ê±Æ÷³¬Ê±Ê±µ÷Óú¯ÊýslotReadFile¶ÁÈ¡Îļþ
¡¡¡¡¡¡ readTimer->start(100);
¡¡¡¡}
¡¡¡¡
¡¡¡¡slotReadFileº¯Êý¸ºÔðÔÚ¶¨Ê±Æ÷³¬Ê±Ê±£¬´ÓÎļþÖжÁÈ¡Êý¾Ý£¬È»ºóÖØÐÂÆô¶¯¶¨Ê±Æ÷£º
¡¡¡¡
¡¡¡¡int Server::slotReadFile()¡¡¡¡// ÏûÏ¢¶ÁÈ¡ºÍ´¦Àíº¯Êý
¡¡¡¡{
¡¡¡¡¡¡readTimer->stop();¡¡¡¡ //ÔÝʱֹͣ¶¨Ê±Æ÷¼Æʱ
¡¡¡¡¡¡ret = read(file, buf );¡¡ //¶ÁÈ¡Îļþ
¡¡¡¡if(ret == NULL)
¡¡¡¡{¡¡¡¡readTimer->start(100);¡¡¡¡ //µ±Ã»ÓÐÐÂÏûϢʱ£¬ÖØÐÂÆô¶¯¶¨Ê±Æ÷
¡¡¡¡ ¡¡ return(-1);
¡¡¡¡}
¡¡¡¡¡¡else
¡¡¡¡¡¡¡¡¡¡ ¸ù¾ÝbufÖеÄÄÚÈݽ«ÏûÏ¢·Ö·¢¸ø¸÷¸öÏàÓ¦µÄ¶ÔÏó´¦Àí¡¡£»
¡¡¡¡readTimer->start(100);¡¡¡¡//ÖØÐÂÆô¶¯¶¨Ê±Æ÷
¡¡¡¡}
¡¡¡¡
¡¡¡¡ÔڸóÌÐòÖУ¬ÀûÓÃÁËÀàËÆÂÖѵķ½Ê½¶¨Ê±¶ÔÓû§Ö¸¶¨µÄÉ豸Îļþ½øÐжÁÈ¡£¬¸ù¾Ý¶Áµ½µÄÊý¾ÝÄÚÈݽ«ÐÅÏ¢·¢Ë͵½¸÷¸öÏàÓ¦µÄ¶ÔÏó¡£Óû§¿ÉÒÔÔÚ×Ô¼ºµÄGUIÖ÷Ïß³ÌÖд´½¨Ò»¸öServerÀ࣬°ïÖúʵÏֵײãµÄÏûÏ¢½ÓÊÕ¹ý³Ì£¬¶ø±¾ÉíÈÔÈ»¿ÉÒÔ´¦ÀíÖîÈç½çÃæÏÔʾµÄÎÊÌâ¡£µ±¸÷¸ö¶ÔÏóÍê³É´¦Àíºó£¬Í¨¹ýÖØÐÂÆô¶¯¶¨Ê±Æ÷¼ÌÐø½øÐÐÖÜÆÚÐÔ¶ÁÈ¡µ×²ãÉ豸ÎļþµÄ¹ý³Ì¡£µ±È»£¬ÕâÖÖ·½·¨ÊʺÏÓÚ¸÷¶ÔÏó¶ÔʼþµÄ´¦Àíʱ¼ä½Ï¶Ì£¬¶øµ×²ãÉ豸·¢À´ÏûÏ¢µÄƵÂÊÓÖÏà¶Ô½ÏÂýµÄÇé¿ö¡£
golshing ÓÚ 2006-07-24 16:17:02·¢±í:
GOOD