在var fs = require('fs');
var request = require('request');
var cheerio = require('cheerio');
var start_url = ["http://blog.codinghorror.com/"]
var wstream = fs.createWriteStream("output.json");
// Extract root domain name from string
function extractDomain(url) {
var domain;
if (url.indexOf("://") > -1) { //find & remove protocol (http(s), ftp, etc.) and get domain
domain = url.split('/')[2];
} else {
domain = url.split('/')[0];
}
domain = domain.split(':')[0]; //find & remove port number
return domain;
}
var req = function(url){
request(url, function(error, response, html){
if(!error){
var $ = cheerio.load(html);
$("a").each(function() {
var link = $(this).attr("href");
var makelinkplain = extractDomain(link);
start_url.push("http://" + makelinkplain);
wstream.write('"http://'+ makelinkplain + '",');
});
}
start_url.shift();
if(start_url.length > 0) {
return req(start_url[0]);
}
wstream.end();
});
}
req(start_url[0]);
我调用方法__init__
以控制应用程序的状态。最初tickMain()
传递给此方法。这意味着在States.STATE_INIT
传递到state_Init()
之前,会调用States.STATE_IDLE
。该计划继续致电tickMain()
。这个过程似乎工作正常(正在执行tickMain()
语句)。然而,UI似乎停留在初始化上,即它不显示(只是白色背景,鼠标光标是加载图标)。我错过了什么?我是否需要从另一个线程中调用print()
?
tickMain()
答案 0 :(得分:0)
当你调用app.exec_()
时,这会在maim线程中启动Qt事件循环。它处理窗口事件,如按钮点击,重绘等。为了使Qt起作用,你不能有任何阻塞主线程的东西(如无限循环),因为这会阻止Qt的事件循环起作用。 / p>
虽然您可以将内容卸载到某个线程,但这可能会对您的应用程序造成过大影响。线程是棘手的,因为您无法从该辅助线程中修改或访问Qt GUI对象。
假设您想要在循环中运行的代码(self.tickMain()
)很快,您可以要求Qt事件循环定期调用您的方法。这样您就不会在任何重要的时间段内阻止事件循环。
您可以使用QTimer
。
def __init__(self):
# you must call the parent class constructor
QtGui.QMainWindow.__init__(self)
# create the timer
self.timer = QTimer(self)
self.timer.timeout.connect(self.tickMain)
self.timer.start(1000) # call tickMain every 1000 milliseconds