事件流。 如何控制并使事件闲置?(+已解决) - 页 6 1234567 新评论 Yedelkin 2011.11.02 20:47 #51 sergeev: 那你有没有提出一个新的问题呢? 主持人发起洪水是不合适的。要澄清的是。当一个用户(包括版主)在一个主题中添加一个新的帖子时,通常会称之为 "回复"。即使是讽刺性质的反驳。 因此,再次澄清:如果你认为这是一个马戏团,请随时删除,或尝试做一个新的信息来说明问题。另一方面,不准确的信息会误导用户。 要补充的是。如果正式发现(如果你帮助发现)用户事件 按照旧的规则填充队列,我将是第一个感谢你的人。 Rashid Umarov 2011.11.02 20:55 #52 Yedelkin:我再补充一下。如果官方发现(如果你帮助发现)自定义事件 按照旧的规则填充队列,我将第一个感谢你。 粗略地说,对事件的处理从未改变。只是帮助最初写得不太正确。 Yedelkin 2011.11.02 20:57 #53 Rosh: 粗略地说,对事件的处理从未改变。只是在帮助中,它最初没有被正确地写入。 谢谢你。这是一种耻辱。因此,手册中的旧规则是错误的。对不起,让您受累了。 Anatoli Kazharski 2012.02.02 05:36 #54 sergeev:... 问题似乎没有再出现,就像它从未发生过一样。亚历克斯,如果你有时间的话,能否请你到你的办公室看看。也就是说,在有和没有你的附加组件的情况下,它现在将如何工作。 --- 2012.02.02 07:52 #55 我积极使用在我的每个应用程序中创建的闲置信息。一切正常。 Anatoli Kazharski 2012.02.02 08:04 #56 sergeev: 我积极使用在我的每个应用程序中创建的闲置信息。一切都在运作。 我可能不再有这个问题了,因为我现在测试的是3个字符,而不是以前的12个。如果我发现有依赖性,我会写的。谢谢。 Anatoli Kazharski 2012.02.19 22:14 #57 sergeev: 我染上了一个毛病。 它的发生是由于专家顾问向自己发送EventChartCustom事件。事实证明,这个事件的发送导致主窗口更新图表(ChartRedraw)。//---我做了这样一个专家来测试你的解决方案,同时试图解决在编辑OBJ_EDIT 对象时文本超级频繁闪烁的问题。//---//+------------------------------------------------------------------+ //| OnChartEvent.mq5 | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" //--- long chart_id=0; string OnOff_event_idle="On/Off event_idle++"; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { chart_id=ChartID(); //--- if(!GlobalVariableCheck(OnOff_event_idle)) { GlobalVariableSet(OnOff_event_idle,1); } //--- Create_Edit(chart_id,0,"Edit_Area","HELLO",CORNER_LEFT_UPPER,"Arial",7,clrWhite,38,18,95,4,1,clrBlack); Create_Button(chart_id,0,"Start_event_idle","START event_idle++",ANCHOR_RIGHT_UPPER,CORNER_LEFT_UPPER,"Arial",8,clrWhite,clrFireBrick,clrNONE,130,26,4,28,1); //--- Comment("id: ",0,"\n", "event_idle++: ",event_idle ); //--- return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); ObjectsDeleteAll(chart_id,-1,-1); } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ bool bidle=false; ushort VM_IDLE=500; ulong event_idle=0; // счётчик событий //--- void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { if(GlobalVariableGet(OnOff_event_idle)==1) { if(id==CHARTEVENT_CUSTOM+VM_IDLE) { // Если последнее посланное больше, чем пришедшее, то сразу выходим if(event_idle>(ulong)lparam || bidle) { bidle=event_idle>(ulong)lparam; //--- if(bidle) { return; } //--- event_idle=0; } //--- event_idle++; // увеличили счётчик событий //--- Comment("id: ",id,"\n", "event_idle++: ",event_idle ); //--- EventChartCustom(chart_id,VM_IDLE,(long)event_idle,0,""); return; // отправили событие с указанием последнего счетчика } //--- EventChartCustom(chart_id,VM_IDLE,(long)event_idle,0,""); // отправили событие с указанием последнего счетчика } //+------------------------------------------------------------------+ //| СОБЫТИЕ_CHARTEVENT_CLICK | //+------------------------------------------------------------------+ if(id==CHARTEVENT_CLICK) { Print("Reset. Event_idle: ",event_idle); //--- event_idle=0; //--- Comment("id: ",id,"\n", "event_idle++: ",event_idle ); } //+------------------------------------------------------------------+ //| СОБЫТИЕ_CHARTEVENT_OBJECT_CLICK | //+------------------------------------------------------------------+ if(id==CHARTEVENT_OBJECT_CLICK) { if(sparam=="Edit_Area") { if((int)GlobalVariableGet(OnOff_event_idle)==0) { GlobalVariableSet(OnOff_event_idle,1); } if((int)GlobalVariableGet(OnOff_event_idle)==1) { GlobalVariableSet(OnOff_event_idle,0); } } //--- if(sparam=="Start_event_idle") { if((int)GlobalVariableGet(OnOff_event_idle)==0) { GlobalVariableSet(OnOff_event_idle,1); ChartRedraw(); return; } if((int)GlobalVariableGet(OnOff_event_idle)==1) { GlobalVariableSet(OnOff_event_idle,0); ChartRedraw(); return; } } } //+------------------------------------------------------------------+ //| CHARTEVENT_OBJECTS_ENDEDIT | //+------------------------------------------------------------------+ if(id==CHARTEVENT_OBJECT_ENDEDIT) { if(ObjectGetInteger(chart_id,"Start_event_idle",OBJPROP_STATE)) { GlobalVariableSet(OnOff_event_idle,1); } } } //+------------------------------------------------------------------+ //| СОЗДАНИЕ_ОБЪЕКТА_BUTTON | //+------------------------------------------------------------------+ void Create_Button(long chrt_id, // id графика int nmb_win, // номер окна string lable_nm, // имя объекта string rename, // отображаемое имя long anchor, // точка привязки long corner, // угол привязки string font_bsc, // шрифт int font_size, // размер шрифта color font_clr, // цвет шрифта color bg_color, // цвет фона color brd_color, // цвет рамки int xsize, // ширина int ysize, // высота int x_dist, // координата по шкале X int y_dist, // координата по шкале Y long zorder) // приоритет { if(ObjectCreate(chrt_id,lable_nm,OBJ_BUTTON,nmb_win,0,0)) // создание объекта { ObjectSetString(chrt_id,lable_nm,OBJPROP_TEXT,rename); // установка имени ObjectSetString(chrt_id,lable_nm,OBJPROP_FONT,font_bsc); // установка шрифта ObjectSetInteger(chrt_id,lable_nm,OBJPROP_COLOR,font_clr); // установка цвета шрифта ObjectSetInteger(chrt_id,lable_nm,OBJPROP_BGCOLOR,bg_color); // установка цвета фона ObjectSetInteger(chrt_id,lable_nm,OBJPROP_BORDER_COLOR,brd_color); // установка цвета фона ObjectSetInteger(chrt_id,lable_nm,OBJPROP_ANCHOR,anchor); // установка точки привязки ObjectSetInteger(chrt_id,lable_nm,OBJPROP_CORNER,corner); // установка угола привязки ObjectSetInteger(chrt_id,lable_nm,OBJPROP_FONTSIZE,font_size); // установка размера шрифта ObjectSetInteger(chrt_id,lable_nm,OBJPROP_XSIZE,xsize); // установка ширины X ObjectSetInteger(chrt_id,lable_nm,OBJPROP_YSIZE,ysize); // установка высоты Y ObjectSetInteger(chrt_id,lable_nm,OBJPROP_XDISTANCE,x_dist); // установка координаты X ObjectSetInteger(chrt_id,lable_nm,OBJPROP_YDISTANCE,y_dist); // установка координаты Y ObjectSetInteger(chrt_id,lable_nm,OBJPROP_SELECTABLE,false); // нельзя выделить объект, если FALSE ObjectSetInteger(chart_id,lable_nm,OBJPROP_ZORDER,zorder); // Приоритет выше/ниже ObjectSetString(chrt_id,lable_nm,OBJPROP_TOOLTIP,"\n"); // нет всплывающей подсказки, если "\n" } } //+------------------------------------------------------------------+ //| СОЗДАНИЕ_ОБЪЕКТА_EDIT | //+------------------------------------------------------------------+ void Create_Edit(long chrt_id, // id графика int nmb_win, // номер окна (подокна) string lable_nm, // имя объекта string text, // отображаемый текст long corner, // угол привязки string font_bsc, // шрифт int font_size, // размер шрифта color font_clr, // цвет шрифта int xsize, // ширина int ysize, // высота int x_dist, // координата по шкале X int y_dist, // координата по шкале Y long zorder, // приоритет color clr) // цвет фона { if(ObjectCreate(chrt_id,lable_nm,OBJ_EDIT,nmb_win,0,0)) // создание объекта { ObjectSetString(chrt_id,lable_nm,OBJPROP_TEXT,text); // установка имени ObjectSetInteger(chrt_id,lable_nm,OBJPROP_CORNER,corner); // установка угла привязки ObjectSetString(chrt_id,lable_nm,OBJPROP_FONT,font_bsc); // установка шрифта ObjectSetInteger(chrt_id,lable_nm,OBJPROP_FONTSIZE,font_size); // установка размера шрифта ObjectSetInteger(chart_id,lable_nm,OBJPROP_COLOR,font_clr); // цвет шрифта ObjectSetInteger(chart_id,lable_nm,OBJPROP_BGCOLOR,clr); // цвет фона ObjectSetInteger(chart_id,lable_nm,OBJPROP_XSIZE,xsize); // ширина ObjectSetInteger(chart_id,lable_nm,OBJPROP_YSIZE,ysize); // высота ObjectSetInteger(chrt_id,lable_nm,OBJPROP_XDISTANCE,x_dist); // установка координаты X ObjectSetInteger(chrt_id,lable_nm,OBJPROP_YDISTANCE,y_dist); // установка координаты Y ObjectSetInteger(chrt_id,lable_nm,OBJPROP_SELECTABLE,false); // нельзя выделить объект, если FALSE ObjectSetInteger(chart_id,lable_nm,OBJPROP_ZORDER,zorder); // Приоритет выше/ниже ObjectSetString(chrt_id,lable_nm,OBJPROP_TOOLTIP,"\n"); // нет всплывающей подсказки, если "\n" } } //+------------------------------------------------------------------+ //---启动专家顾问后,你会在左上角的图表中看到以下内容。//---通过点击"START event_idle++"按钮,你将进入你的(Alex)解决方案。我们在图表上看到event_idle++ 计数器的增量。 只要按钮被按下,你的代码就会工作。但它消耗了大量的资源。CPU负载(在双核上测试)从~90% 到~100% 不等。在启动前或释放按钮时,CPU负载在~5% 到~10% 之间。点击(左键)图形,可将计数器重置为零。 在输入框中输入文本不会导致闪烁,因为在输入的那一刻,你的代码被"On/Off event_idle++"全局变量 禁用。这当然是一个拐杖,但作为一个临时的解决方案,它对一些简单的解决方案来说是没有问题的。CPU负载并不是唯一的问题。当计数器运行时,交易终端的窗口很快打开,但窗口的大小调整却明显变慢了。并非总是如此,但这样的时刻是存在的。 附加的文件: OnChartEvent.mq5 10 kb Anatoli Kazharski 2012.02.19 22:54 #58 tol64:CPU负载并不是唯一的问题。当计数器运行时,交易终端的窗口很快打开,但窗口的大小调整却明显变慢。并非总是如此,但也有这样的时刻。CPU负载问题可以通过以下方式解决。指定事件计数器每秒钟更新一次。我们添加以下代码。在OnInit()中。EventSetTimer(1);//---在程序主体中。//+------------------------------------------------------------------+ //| ТАЙМЕР | //+------------------------------------------------------------------+ long countSecond=0; //--- void OnTimer() { if(GlobalVariableGet(OnOff_event_idle)==1) { countSecond++; } }//---对亚历克斯的 代码(用红色标记)。 if(GlobalVariableGet(OnOff_event_idle)==1) { if(id==CHARTEVENT_CUSTOM+VM_IDLE && countSecond>0) { // Если последнее посланное больше, чем пришедшее, то сразу выходим if(event_idle>(ulong)lparam || bidle) { bidle=event_idle>(ulong)lparam; //--- if(bidle) { return; } //--- event_idle=0; } //--- event_idle++; // увеличили счётчик событий //--- Comment("id: ",id,"\n", "event_idle++: ",event_idle ); //--- // Отправили событие с указанием последнего счетчика EventChartCustom(chart_id,VM_IDLE,(long)event_idle,0,""); countSecond=0; return; } //--- // Отправили событие с указанием последнего счетчика EventChartCustom(chart_id,VM_IDLE,(long)event_idle,0,""); countSecond=0; }//---在CHARTEVENT_CLICK 事件处理程序块中(用红色标记)。//+------------------------------------------------------------------+ //| СОБЫТИЕ_CHARTEVENT_CLICK | //+------------------------------------------------------------------+ if(id==CHARTEVENT_CLICK) { Print("Reset. Event_idle: ",event_idle); //--- event_idle=0; countSecond=0; //--- Comment("id: ",id,"\n", "event_idle++: ",event_idle ); }//---CHARTEVENT_OBJECT_CLICK 事件处理程序块应该被编辑如下 + 按钮的状态应该被全部检查,因为有时即使 "错误 "地按下它,也会使它被压制,如果它之前是这样的,但该块中的其他代码将被解决,混乱将开始。//+------------------------------------------------------------------+ //| СОБЫТИЕ_CHARTEVENT_OBJECT_CLICK | //+------------------------------------------------------------------+ if(id==CHARTEVENT_OBJECT_CLICK) { if(sparam=="Edit_Area") { if((int)GlobalVariableGet(OnOff_event_idle)==0) { GlobalVariableSet(OnOff_event_idle,1); } if((int)GlobalVariableGet(OnOff_event_idle)==1) { GlobalVariableSet(OnOff_event_idle,0); } } //--- if(sparam=="Start_event_idle") { if((int)GlobalVariableGet(OnOff_event_idle)==0) { countSecond=0; GlobalVariableSet(OnOff_event_idle,1); ObjectSetInteger(chart_id,"Start_event_idle",OBJPROP_STATE,true); //--- ChartRedraw(); return; } //--- if((int)GlobalVariableGet(OnOff_event_idle)==1) { countSecond=0; GlobalVariableSet(OnOff_event_idle,0); ObjectSetInteger(chart_id,"Start_event_idle",OBJPROP_STATE,false); //--- ChartRedraw(); return; } } }//---现在变得更加有趣了。:)//---P.S. 如果你有很多秒,你可以试着摆弄一下GetTickCount()。 --- 2012.02.20 10:00 #59 我还能说什么呢1.这是 对CPU的一种负担。移除它,它就会安静下来。2.闲置循环本身对CPU没有明显的影响。3.edith闪烁的问题不是单一的0-chart的问题。 它是向对象-chart发送事件的问题。这导致了主0图的重绘,并给出了闪烁的情况。 Anatoli Kazharski 2012.02.20 18:12 #60 sergeev: 我还能说什么呢1.这是对CPU的一种负担。移除它,它就会安静下来。 2.闲置循环本身对CPU没有明显的影响。3.edith闪烁的问题不是单一的0-chart的问题。 它是向对象-chart发送事件的问题。这导致了主0图的重绘,并给出了闪烁的情况。 谢谢你的澄清。我会研究的。 1234567 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
那你有没有提出一个新的问题呢?
主持人发起洪水是不合适的。要澄清的是。当一个用户(包括版主)在一个主题中添加一个新的帖子时,通常会称之为 "回复"。即使是讽刺性质的反驳。
因此,再次澄清:如果你认为这是一个马戏团,请随时删除,或尝试做一个新的信息来说明问题。另一方面,不准确的信息会误导用户。
要补充的是。如果正式发现(如果你帮助发现)用户事件 按照旧的规则填充队列,我将是第一个感谢你的人。
我再补充一下。如果官方发现(如果你帮助发现)自定义事件 按照旧的规则填充队列,我将第一个感谢你。
粗略地说,对事件的处理从未改变。只是在帮助中,它最初没有被正确地写入。
...
我积极使用在我的每个应用程序中创建的闲置信息。一切正常。
我积极使用在我的每个应用程序中创建的闲置信息。一切都在运作。
sergeev:
我染上了一个毛病。它的发生是由于专家顾问向自己发送EventChartCustom事件。事实证明,这个事件的发送导致主窗口更新图表(ChartRedraw)。
//---
我做了这样一个专家来测试你的解决方案,同时试图解决在编辑OBJ_EDIT 对象时文本超级频繁闪烁的问题。
//---
//---
启动专家顾问后,你会在左上角的图表中看到以下内容。
//---
通过点击"START event_idle++"按钮,你将进入你的(Alex)解决方案。我们在图表上看到event_idle++ 计数器的增量。
只要按钮被按下,你的代码就会工作。但它消耗了大量的资源。CPU负载(在双核上测试)从~90% 到~100% 不等。在启动前或释放按钮时,CPU负载在~5% 到~10% 之间。点击(左键)图形,可将计数器重置为零。
在输入框中输入文本不会导致闪烁,因为在输入的那一刻,你的代码被"On/Off event_idle++"全局变量 禁用。这当然是一个拐杖,但作为一个临时的解决方案,它对一些简单的解决方案来说是没有问题的。
CPU负载并不是唯一的问题。当计数器运行时,交易终端的窗口很快打开,但窗口的大小调整却明显变慢了。并非总是如此,但这样的时刻是存在的。
CPU负载并不是唯一的问题。当计数器运行时,交易终端的窗口很快打开,但窗口的大小调整却明显变慢。并非总是如此,但也有这样的时刻。
CPU负载问题可以通过以下方式解决。指定事件计数器每秒钟更新一次。我们添加以下代码。
在OnInit()中。
//---
在程序主体中。
//---
对亚历克斯的 代码(用红色标记)。
//---
在CHARTEVENT_CLICK 事件处理程序块中(用红色标记)。
//---
CHARTEVENT_OBJECT_CLICK 事件处理程序块应该被编辑如下 + 按钮的状态应该被全部检查,因为有时即使 "错误 "地按下它,也会使它被压制,如果它之前是这样的,但该块中的其他代码将被解决,混乱将开始。
//---
现在变得更加有趣了。:)
//---
P.S. 如果你有很多秒,你可以试着摆弄一下GetTickCount()。
我还能说什么呢
1.这是 对CPU的一种负担。移除它,它就会安静下来。
2.闲置循环本身对CPU没有明显的影响。
3.edith闪烁的问题不是单一的0-chart的问题。 它是向对象-chart发送事件的问题。这导致了主0图的重绘,并给出了闪烁的情况。
我还能说什么呢
1.这是对CPU的一种负担。移除它,它就会安静下来。
2.闲置循环本身对CPU没有明显的影响。
3.edith闪烁的问题不是单一的0-chart的问题。 它是向对象-chart发送事件的问题。这导致了主0图的重绘,并给出了闪烁的情况。