1. 请问有谁知道VNC软件的源代码?
vnc win-hook + event-simulate + gdi-bitmap-capture(delay send) + libjpeg + socket ******************************************************************************************************************* VNC的图像更新机制核心为,桌面区域更新记录策略和更新区域通知策略。 桌面更新区域记录主要是通过hooks记录桌面上变化的矩形区域, 只记录更新的矩形区不记录具体更新的数据。 更新区域记录步骤大致如下: 1.wm_hooks截获桌面变化的相关消息,并转化为自定义的消息发送给WMHooksThread线程处理。 2. WMHooksThread 中用SimpleUpdateTracker new_changes记录新的更新区域. 3.把SimpleUpdateTracker new_changes更新拷贝到SDisplay中。 4.每次要发送桌面更新的时候,把SDisplay中记录的更新区域传给VNCServerST 对象中。 更新区域的通知主要有poll和push两种机制。push是服务器每隔10ms检查有没有更新,如果有更新则主动把更新推送给客户端, poll机制则是客户端主动请求更新,客户端通过发送framebufferupdate请求某一个区域更新,服务器处理该消息发送相应的更新。
详细分析如下: 1.Wm_hooks截获消息并转化为自定义的消息发送给WMHooksThread线程处理。 Wm_hooks自定义的消息: UINT WM_HK_WindowChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.WindowChanged")); UINT WM_HK_WindowClientAreaChanged = UINT WM_HK_WindowBorderChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.WindowBorderChanged")); UINT WM_HK_RectangleChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.RectangleChanged")); UINT WM_HK_CursorChanged = RegisterWindowMessage(_T("RFB.WM_Hooks.CursorChanged")); 钩子截获到消息以后,把它转化为自定义的消息,然后发送给WMHooksThread线程处理,消息转化如下: 边框更新消息:WM_NCPAINT,WM_NCACTIVATE 客户区域更新消息:BM_SETCHECK, BM_SETSTATE,EM_SETSEL,WM_CHAR,WM_ENABLE,WM_KEYUP,WM_LBUTTONUP,WM_MBUTTONUP,WM_PALETTECHANGED,WM_RBUTTONUP,WM_SYSCOLORCHANGE,WM_SETTEXT。 窗口改变消息:WM_HSCROLL,WM_VSCROLL,482,485。 矩形区更新消息:WM_DESTROY 窗口客户区消息:WM_PAINT 鼠标消息:WM_NCMOUSEMOVE,WM_MOUSEMOVE 2 . WMHooksThread 中用SimpleUpdateTracker new_changes记录新的更新区域 WMHooksThread::run() 函数中先判断出矩形区域改变的大小,然后调用NotifyHooksRegion(const Region& r)把改变的区域记录到SimpleUpdateTracker new_changes中。 NotifyHooksRegion(const Region& r) { Lock l(hook_mgr_lock); std::list::iterator i; for (i=hooks.begin(); i!=hooks.end(); i++) { (*i)->new_changes.add_changed(r); if (!(*i)->notified) { (*i)->notified = true; PostMessage((*i)->getHandle(), WM_USER, 0, 0); // 把消息通知到clipper见下面一个处理函数 } } } 3.把更新区域拷贝到SDisplay中 rfb::win32::WMHooks::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) { switch (msg) { case WM_USER: { Sleep(0); Lock l(hook_mgr_lock); notified = false; new_changes.get_update(*clipper); //把更新通知到clipper中 new_changes.clear(); } break; } return MsgWindow::processMessage(msg, wParam, lParam); } Cliper在下面设置 rfb::win32::WMHooks::setUpdateTracker(UpdateTracker* ut) { if (clipper) delete clipper; clipper = new ClippedUpdateTracker(*ut); clipper->set_clip_region(clip_region); return AddHook(this); } UpdateTracker* ut 为void SDisplay::start(VNCServer*vs)中设置 core->using_hooks = core->wm_hooks.setUpdateTracker(this); 4.把SDisplay中记录的数据传给VNCServerST 对象 在 SDisplay::processEvent(HANDLE event) { try_update = flushChangeTracker() || try_update; //把变化的区域拷贝到VNCServerST中 if (try_update) server->tryUpdate(); //把更新发送给服务器 } flushChangeTracker()实现如下: bool SDisplay::flushChangeTracker() { if (change_tracker.is_empty()) return false; change_tracker.translate(screenRect.tl.negate()); change_tracker.get_update(*server); //server 实际指向VNCServerST 对象该函数把SDisplay中的更新拷贝到VNCServerST中。 change_tracker.clear(); return true; } 两种数据更新方式:Push机制和Pull机制 Push: SdisplayCore 中IntervalTimer cursorTimer定时器,每隔10ms尝试着检查一下是否有更新,如果有更新就发送更新给客户端
第一步: LRESULT SDisplayCore::processMessage(UINT msg, WPARAM wParam, LPARAM lParam) { case TIMER_CURSOR: display->triggerUpdate(); //SDisplay* display; } 第二步: void SDisplay::triggerUpdate() { if (core) SetEvent(updateEvent); //使事件对象为受信状态 } 第三步: SDisplay::processEvent(HANDLE event) { if (event == updateEvent) { if (try_update) server->tryUpdate(); // VNCServer* server指针 指向子类VNCServerST } } 第四步:向每一个连接的客户端发送更新 void VNCServerST::tryUpdate() { std::list::iterator ci, ci_next; for (ci = clients.begin(); ci != clients.end(); ci = ci_next) { ci_next = ci; ci_next++; (*ci)->writeFramebufferUpdateOrClose(); } }
第五步: void VNCSConnectionST::writeFramebufferUpdateOrClose() { try { writeFramebufferUpdate(); } catch(rdr::Exception &e) { close(e.str()); } } 第六步:SimpleUpdateTracker updates对象记录更新的区域,如果屏幕有更新则发送更新 void VNCSConnectionST::writeFramebufferUpdate(){ if (!update.is_empty() || writer()->needFakeUpdate() || drawRenderedCursor) { int nRects = update.numRects() + (drawRenderedCursor ? 1 : 0); writer()->writeFramebufferUpdateStart(nRects); Region updatedRegion; writer()->writeRects(update, &image_getter, &updatedRegion); // SmsgWriter * updates.subtract(updatedRegion); if (drawRenderedCursor) writeRenderedCursorRect(); writer()->writeFramebufferUpdateEnd(); requested.clear(); }
} 第七步:利用RFB协议发送更新 void SMsgWriterV3::writeFramebufferUpdateStart(int nRects) { startMsg(msgTypeFramebufferUpdate); os->pad(1); if (wsccb) nRects++; if (needSetDesktopSize) nRects++; os->writeU16(nRects); nRectsInUpdate = 0; nRectsInHeader = nRects; if (wsccb) { wsccb->writeSetCursorCallback(); wsccb = 0; } } Poll机制:客户端通过发送更新请求,请求更新某一个区域。 第一步:读取到一个更新某一个区域的请求 void SMsgReaderV3::readMsg() { case msgTypeFramebufferUpdateRequest: readFramebufferUpdateRequest(); break; } 第二步:调用网络事件处理对象handler处理事件 void SMsgReader::readFramebufferUpdateRequest() { bool inc = is->readU8(); int x = is->readU16(); int y = is->readU16(); int w = is->readU16(); int h = is->readU16(); endMsg(); handler->framebufferUpdateRequest(Rect(x, y, x+w, y+h), inc);//handler 为 SMsgHandler* handler指针 是指向VNCSConnectionST对象 } 第三步: void VNCSConnectionST::framebufferUpdateRequest(const Rect& r,bool incremental) { if (!(accessRights & AccessView)) return; SConnection::framebufferUpdateRequest(r, incremental); Region reqRgn(r); requested.assign_union(reqRgn); if (!incremental) { updates.add_changed(reqRgn); server->comparer->add_changed(reqRgn); } writeFramebufferUpdate(); } 第四步:SimpleUpdateTracker updates对象记录更新的区域,如果屏幕有更新则发送更新 void VNCSConnectionST::writeFramebufferUpdate(){ if (!update.is_empty() || writer()->needFakeUpdate() || drawRenderedCursor) { int nRects = update.numRects() + (drawRenderedCursor ? 1 : 0); writer()->writeFramebufferUpdateStart(nRects); Region updatedRegion; writer()->writeRects(update, &image_getter, &updatedRegion); // SmsgWriter * updates.subtract(updatedRegion); if (drawRenderedCursor) writeRenderedCursorRect(); writer()->writeFramebufferUpdateEnd(); requested.clear(); } } 第五步:利用RFB协议发送更新 void SMsgWriterV3::writeFramebufferUpdateStart(int nRects) { startMsg(msgTypeFramebufferUpdate); os->pad(1); if (wsccb) nRects++; if (needSetDesktopSize) nRects++; os->writeU16(nRects); nRectsInUpdate = 0; nRectsInHeader = nRects; if (wsccb) { wsccb->writeSetCursorCallback(); wsccb = 0; } }
你看一下吧 我也是给你找的!
2. 怎么样在炒股软件中加入自己要的公式 源代码我有 就是不懂怎么输入其他的东西
打开软件的公式管理器。快捷键是Ctrl+F
2.然后在打开的公式管理器中选择自己的添加的公式的类型,指标公式还是选股公式。这里 以我在网站上下载的一个选股公式(百发百中)为例讲解如何操作。
3.我们在对应的输入框输入公式名称,是否需要密码保护 公式用法信息等。
4.然后把公式源码粘贴到相应区域。点击右侧的测试公式按钮。如果公式无误就会显示测试 通过。如果测试出现错误的话就要查看公式哪里出错,添加的是选股公式还是指标公式。 二者不要混淆!
5.当公式通过以后就点击确定,公式就添加到你的软件里了。
6.利用添加的公式选股!
注意事项
在步骤2中要注意自己添加的是选股公式还是指标公式,如果指标公式放到选股公式里会测试失败,同样选股公式放到指标公式里也会测试不过。
有时候选出的股票个数是0,是因为没有符合条件的股票,可以把选股条件放宽或者改换其他方式选股。
3. 如何在股票软件中添加股票公式,指标等?
我用的钱龙金典不支持自编指标攻能。
建议你下载大智慧或者大智慧LEVEL2(分析家内核),这两种软件自编指标功能非常简单方便。
大智慧LEVEL2
ftp://southftp.gw.com.cn/pub/Dzh_Level2_V25w.exe
大智慧V5.57
http://www1.gw.com.cn/down/down.php?s=1
4. 我想做个股票程序,有没有可以参考的开源源代码?
估计没有,因为这种软件正是同花顺和大智慧这些上市公司赚钱的法宝,所有的证券公司和股民都用它们的软件,所以每个人下单的事情它们都知道,因此使用这些大数据统计资料包装成(像主力资金注入流出,机构入场等)各种增值服务,标价从每年几百块到十几万块不等的卖给土豪们赚钱呢。
他们怎么会把这些东西告诉你呢。
5. 股票软件的代码写好后,放在哪里
你就直接打开软件,输入代码在屏幕右下角就会显示了
6. 我用中文编写的公式,怎么上传到股票软件上?代码怎么用?
1、首先打开通达信交易软件。
2、打开软件后,来到股票查看界面。选择左上角的“功能”--“专家系统”--“公式管理器”,或者直接按快捷键Ctrl+F键,打开公式管理器。
3、在公式管理器编辑界面,选择你要导入的公式类型,选择“其他类型”或“条件选股公式”,然后点击右上角的“新建”按钮。
4、在公式编辑界面,给公式取一个名字便于识别,对公式进行一定的描述,然后写上源代码,或者导入源代码,最后再点测试公式。看是否能测试通过。通过后,最后确定。
5、下面,利用我们制作好的公式来进行选出满足公式的股票。点击左上角的“功能”,选择“选股器”里面的“综合选股”或“条件选股”。
6、在公式中,下拉菜单,找到我们制作好的公式。
7、然后“加入条件”,点击右下角“执行选股”,数据就会开始分析。
8、你可以把得到的股票添加到自选的板块,这样数据分析完后,找到相应的板块,比如我这里添加到自选股板块中。按F6查看自选股板块,就得到了我这个公式筛选出来的股票了。
股票公式专家团为你解答,希望能帮到你,祝投资顺利。
7. 怎么在股票软件加入自己的指标.详解.谢谢.
很简单给你截几个图你可以参考下。(我的软件是 广发证券通达信版本)
1点击功能选择公式系统
2从公式系统右边的三角向右展开选择公式管理器 或者可以直接按 快捷键 ctrl+F
3如图就是公式编辑器
4在公式编辑器的右边你可以自己新建 编写公式,也可以把已有的公式代入到系统中来。
如果你自己想自己编写公式可以点击 新建按钮。 如果你想代入一个公式可以点击 导入公式。按照操作步骤操作就可以了,挺简单的。
8. 请问用航海家的源码 在其他的股票软件里怎么做公式啊?
不可以的,除非你用的软件有上阵深证数据授权,并且有指标编辑平台,否则是不可以的哦。。。。。