用 node-webkit 开发桌面程序怎么样?

2015-10-15 01:33:02 +08:00
 xuexixuexi
主要是 Windows 下的桌面,之前是用 MFC ,可以自画控件,用 node-webkit 要怎么自画控件,怎么响应消息?
对多线程支持怎么样?
9892 次点击
所在节点    Node.js
31 条回复
xuexixuexi
2015-10-17 01:57:13 +08:00
@sagnitude 你说的是一个串行的流程,即: js -> node -> C -> node -> js

我问的是一个并行的过程,即: js -> node -> C (Start) -> node -> js -> 页面显示 开始啦
C (5 %) -> node -> js -> 页面显示 我完成 5% 啦
C (10 %) -> node -> js -> 页面显示 我完成 10% 啦
.....
C (100 %) -> node -> js -> 页面显示 我搞完啦
xuexixuexi
2015-10-17 02:00:56 +08:00
v2ex 的回复不好,把我的空格给吃了,我再画一遍:
你说的是一个串行的流程,即: js -> node -> C -> node -> js

我问的是一个并行的过程,即: js -> node -> C (Start) -> node -> js -> 页面显示 开始啦
____________________________________C (5 %) -> node -> js -> 页面显示 我完成 5% 啦
____________________________________C (10 %) -> node -> js -> 页面显示 我完成 10% 啦
____________________________________.....
____________________________________C (100 %) -> node -> js -> 页面显示 我搞完啦
sagnitude
2015-10-17 11:34:06 +08:00
@xuexixuexi 你用回调函数不就是异步的么

大约是如下的吧,参考了 http://www.cnblogs.com/yupeng/p/3469444.html

htmlpage.js

function requestNodejs() {
require('nodejs-c-extension').execute(params, function onTrunkGotCallback(percent) {
//update the progress
updateHtmlProgress(percent);
}, function onFinishCallback(responseData){
//task finished
updateHtmlByData(responseData);
});
}

nodejs-c-extension.cc

#include <node.h>

using namespace v8;

Handle<Value> HandleCall(const Arguments& args) {
HandleScope scope;

/*
* 3 arguments: params, trunkCallback, finishCallback
*/
Local<Value> params = Local<Value>::Cast(args[0]);
Local<Function> trunkCallback = Local<Function>::Cast(args[1]);
Local<Function> finishCallback = Local<Function>::Cast(args[2]);

const unsigned argc = 1;
Local<Value> argv[argc];
//Do some stuff and report the progress
for (int i = 0; i < 100; i++) {
argv[argc] = { Local<Value>::New(String::New(i) };
trunkCallback->Call(Context::GetCurrent()->Global(), argc, argv);
}

//finished, replace argv with data got
finishCallback->Call(Context::GetCurrent()->Global(), argc, argv);

return scope.Close(Undefined());
}

/*
* Define function exports.execute as HandleCall
*/
void Init(Handle<Object> exports, Handle<Object> module) {
exports->Set(String::NewSymbol("execute"),
FunctionTemplate::New(HandleCall)->GetFunction());
}

NODE_MODULE(nodejs-c-extension, Init)
sagnitude
2015-10-17 11:34:53 +08:00
@xuexixuexi 还是说你是起了 100 个线程,每个完成加 1%?
xuexixuexi
2015-10-17 16:26:28 +08:00
@sagnitude 太感谢了, 100 个线程和 1 个线程一样的道理,我主要是看一下 C 扩展怎么回调 node
现在明白了,看来值得一学
您真是大好人:)
SCaffrey
2015-11-03 18:16:18 +08:00
@hkongm 请教一下 Electron 能不能打包成二进制文件之类的?
hkongm
2015-11-04 08:40:16 +08:00
@SCaffrey Electron 没具体用过, NW 倒是用过, win 下有一堆文件需要带着。。。 Mac 下无所谓了,实际上看到的就是个图标
估计 Electron 和 NW 差不多吧
SCaffrey
2015-11-04 16:32:58 +08:00
@hkongm 谢谢!最后用了现成的 electron-packager 搞定的...在 repo 里开 issue 问人家说不支持打包成二进制 QAQ
yangzh
2015-11-22 18:51:00 +08:00
@SCaffrey nw 和 electron 原生不支持打包成为一个大 exe 。

不过可以看看 http://enigmaprotector.com/en/aboutvb.html 这是一个第三方工具,可以把程序其余的依赖文件塞进一个很大的 exe 文件里。
SCaffrey
2015-11-22 18:54:55 +08:00
@yangzh 谢谢您!我最后选择了 electron-packager https://www.npmjs.com/package/electron-packager
hkongm
2015-12-24 14:38:36 +08:00
前端工程师的话,如果浏览器端已经开发完成,打包过程大概 1 个小时( node 环境已有已熟悉, nodewebkit 从零开始)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://tanronggui.xyz/t/228137

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX