Não é apropriado para um moderador iniciar uma inundação. Para esclarecer. Quando um utilizador (incluindo um moderador) adiciona um novo post a um tópico, é comum chamar-lhe uma "resposta". Mesmo que se trate de uma réplica de natureza sarcástica.
Portanto, mais uma vez, com um esclarecimento: se o perceber como um circo, sinta-se à vontade para o apagar, ou tente apresentar uma nova mensagem sobre os seus méritos. A informação imprecisa, por outro lado, pode induzir em erro os utilizadores.
Para acrescentar. Serei o primeiro a agradecer-lhe se se verificar oficialmente (se ajudar a descobrir) que os eventos dos utilizadores preenchem a fila de acordo com as antigas regras.
Acrescentarei. Serei o primeiro a agradecer-lhe se se verificar oficialmente (se ajudar a descobrir) que os eventos dos utilizadores preenchem a fila de acordo com as antigas regras.
Grosseiramente falando, o tratamento dos acontecimentos nunca mudou. É que a ajuda não foi inicialmente escrita de forma bastante correcta.
O problema não parece voltar a surgir, como se nunca tivesse acontecido.Alex, poderia por favor dar uma vista de olhos no seu escritório, se tiver um minuto livre. Isto é, como funcionará agora com e sem o seu add-on.
Acontece devido ao envio do evento EventChartCustom do Expert Advisor para si próprio. Acontece que este envio de evento provoca a actualização do gráfico (ChartRedraw) da janela principal.
//---
Fiz um tal especialista para testar a sua solução e ao mesmo tempo tentei resolver o problema com tremulações super frequentes de texto enquanto editava um objecto 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 |//+------------------------------------------------------------------+intOnInit()
{
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 |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
Comment("");
ObjectsDeleteAll(chart_id,-1,-1);
}
//+------------------------------------------------------------------+//| ChartEvent function |//+------------------------------------------------------------------+bool bidle=false;
ushort VM_IDLE=500;
ulong event_idle=0; // счётчик событий//---voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &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, // координата по шкале Xint y_dist, // координата по шкале Ylong 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); // установка ширины XObjectSetInteger(chrt_id,lable_nm,OBJPROP_YSIZE,ysize); // установка высоты YObjectSetInteger(chrt_id,lable_nm,OBJPROP_XDISTANCE,x_dist); // установка координаты XObjectSetInteger(chrt_id,lable_nm,OBJPROP_YDISTANCE,y_dist); // установка координаты YObjectSetInteger(chrt_id,lable_nm,OBJPROP_SELECTABLE,false); // нельзя выделить объект, если FALSEObjectSetInteger(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, // координата по шкале Xint y_dist, // координата по шкале Ylong 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); // установка координаты XObjectSetInteger(chrt_id,lable_nm,OBJPROP_YDISTANCE,y_dist); // установка координаты YObjectSetInteger(chrt_id,lable_nm,OBJPROP_SELECTABLE,false); // нельзя выделить объект, если FALSEObjectSetInteger(chart_id,lable_nm,OBJPROP_ZORDER,zorder); // Приоритет выше/нижеObjectSetString(chrt_id,lable_nm,OBJPROP_TOOLTIP,"\n"); // нет всплывающей подсказки, если "\n"
}
}
//+------------------------------------------------------------------+
//---
Depois de lançar o Expert Advisor, verá o seguinte na tabela no canto superior esquerdo:
//---
Ao clicar no botão"START event_idle++", terá acesso à sua solução(Alex). Vemos o incremento do contador event_idle++ logo no gráfico.
Desde que o botão seja premido, o seu código funcionará. Mas consome muitos recursos. A carga da CPU (testada no núcleo duplo) varia entre ~90% a ~100%. A carga da CPU varia de ~5% a ~10% antes do início ou quando o botão é libertado. Clicando (clicando com o botão esquerdo do rato) no gráfico, o contador é reposto a zero.
Introduzir texto no campo de introdução não causa cintilação, porque no momento da introdução o seu código é desactivado pela variável global"On/Off event_idle++". É uma muleta, claro, mas como solução temporária é bom para algumas soluções simples.
A carga da CPU não é o único problema. Quando o contador está a funcionar, as janelas do terminal de comércio abrem-se rapidamente, mas o redimensionamento das janelas abranda bastante. Nem sempre, mas tais momentos estão lá.
A carga da CPU não é o único problema. Quando o contador está a funcionar, as janelas do terminal de comércio abrem rapidamente, mas o redimensionamento das janelas abranda bastante. Nem sempre, mas há tais momentos.
O problema de carga da CPU pode ser resolvido da seguinte forma. Especificar que o contador de eventos é actualizado uma vez por segundo. Acrescentamos o seguinte código:
CHARTEVENT_OBJECT_CLICK bloco manipulador de eventos deve ser editado da seguinte forma + O estado do botão deve ser verificado de qualquer forma, porque por vezes até mesmo premindo-o "erroneamente" irá deixá-lo deprimido, se era assim antes, mas o resto do código no bloco irá funcionar e a confusão irá começar:
1. é um fardo para a CPU. Retire-o e ele ficará calmo.
2. O laço ocioso em si não tem qualquer efeito perceptível sobre a CPU.
3. O problema com a cintilação do édito não é um problema com um único gráfico 0. É um problema com o envio de um evento para o gráfico-objecto. Isto faz com que o gráfico 0 principal seja redesenhado e dá cintilação.
1. é um fardo para a CPU. Retire-o e ele ficará calmo.
2. O laço ocioso em si não tem qualquer efeito perceptível sobre a CPU.
3. O problema com a cintilação do édito não é um problema com um único gráfico 0. É um problema com o envio de um evento para o gráfico-objecto. Isto faz com que o gráfico 0 principal seja redesenhado e dá cintilação.
Obrigado pelo esclarecimento. Vou analisar a questão.
E já fez uma nova pergunta?
Não é apropriado para um moderador iniciar uma inundação. Para esclarecer. Quando um utilizador (incluindo um moderador) adiciona um novo post a um tópico, é comum chamar-lhe uma "resposta". Mesmo que se trate de uma réplica de natureza sarcástica.
Portanto, mais uma vez, com um esclarecimento: se o perceber como um circo, sinta-se à vontade para o apagar, ou tente apresentar uma nova mensagem sobre os seus méritos. A informação imprecisa, por outro lado, pode induzir em erro os utilizadores.
Para acrescentar. Serei o primeiro a agradecer-lhe se se verificar oficialmente (se ajudar a descobrir) que os eventos dos utilizadores preenchem a fila de acordo com as antigas regras.
Acrescentarei. Serei o primeiro a agradecer-lhe se se verificar oficialmente (se ajudar a descobrir) que os eventos dos utilizadores preenchem a fila de acordo com as antigas regras.
Grosseiramente falando, o tratamento dos acontecimentos nunca mudou. É só que não foi originalmente escrito correctamente na ajuda.
...
Utilizo activamente a mensagem ociosa criada em cada uma das minhas aplicações. Tudo funciona.
Utilizo activamente a mensagem ociosa criada em cada uma das minhas aplicações. Tudo está a funcionar.
sergeev:
Apanhei um insecto.Acontece devido ao envio do evento EventChartCustom do Expert Advisor para si próprio. Acontece que este envio de evento provoca a actualização do gráfico (ChartRedraw) da janela principal.
//---
Fiz um tal especialista para testar a sua solução e ao mesmo tempo tentei resolver o problema com tremulações super frequentes de texto enquanto editava um objecto OBJ_EDIT.
//---
//---
Depois de lançar o Expert Advisor, verá o seguinte na tabela no canto superior esquerdo:
//---
Ao clicar no botão"START event_idle++", terá acesso à sua solução(Alex). Vemos o incremento do contador event_idle++ logo no gráfico.
Desde que o botão seja premido, o seu código funcionará. Mas consome muitos recursos. A carga da CPU (testada no núcleo duplo) varia entre ~90% a ~100%. A carga da CPU varia de ~5% a ~10% antes do início ou quando o botão é libertado. Clicando (clicando com o botão esquerdo do rato) no gráfico, o contador é reposto a zero.
Introduzir texto no campo de introdução não causa cintilação, porque no momento da introdução o seu código é desactivado pela variável global"On/Off event_idle++". É uma muleta, claro, mas como solução temporária é bom para algumas soluções simples.
A carga da CPU não é o único problema. Quando o contador está a funcionar, as janelas do terminal de comércio abrem-se rapidamente, mas o redimensionamento das janelas abranda bastante. Nem sempre, mas tais momentos estão lá.
A carga da CPU não é o único problema. Quando o contador está a funcionar, as janelas do terminal de comércio abrem rapidamente, mas o redimensionamento das janelas abranda bastante. Nem sempre, mas há tais momentos.
O problema de carga da CPU pode ser resolvido da seguinte forma. Especificar que o contador de eventos é actualizado uma vez por segundo. Acrescentamos o seguinte código:
No OnInit():
//---
No corpo do programa:
//---
Ao código do Alex(marcado a vermelho):
//---
EmCHARTEVENT_CLICK bloco manipulador de eventos(marcado em vermelho):
//---
CHARTEVENT_OBJECT_CLICK bloco manipulador de eventos deve ser editado da seguinte forma + O estado do botão deve ser verificado de qualquer forma, porque por vezes até mesmo premindo-o "erroneamente" irá deixá-lo deprimido, se era assim antes, mas o resto do código no bloco irá funcionar e a confusão irá começar:
//---
Agora fica mais interessante. :)
//---
P.S. Se tiver muitos segundos, pode tentar mexer-se com GetTickCount().
O que posso dizer
1. é um fardo para a CPU. Retire-o e ele ficará calmo.
2. O laço ocioso em si não tem qualquer efeito perceptível sobre a CPU.
3. O problema com a cintilação do édito não é um problema com um único gráfico 0. É um problema com o envio de um evento para o gráfico-objecto. Isto faz com que o gráfico 0 principal seja redesenhado e dá cintilação.
O que posso dizer
1. é um fardo para a CPU. Retire-o e ele ficará calmo.
2. O laço ocioso em si não tem qualquer efeito perceptível sobre a CPU.
3. O problema com a cintilação do édito não é um problema com um único gráfico 0. É um problema com o envio de um evento para o gráfico-objecto. Isto faz com que o gráfico 0 principal seja redesenhado e dá cintilação.