В Телеграмм отправляются не полные скрины. - страница 2

 
Dmitry Fedoseev #:

Файл в методе открывается с флагами FILE_SHARE_WRITE|FILE_SHARE_READ. Потрясающее решение!

Тоже удивился
Акцентировать не стал, т.к. не знаю почему так решил сделать ТС
 
Что касается места на диске, то свободных более 20 Гиг, диск SSD,
память загружена на 30-40%... на систему работают 3 ядра...
терминал отбирает всего 10-12% ресурсов системы и всего 100-120 метров памяти...
судя по формируемым файлам, они не очень то и большие, 30-50 кило...
да и записываться должны по идее моментально...

Спасибо, друзья...
пока добавил задержку - 1000 мсек... посмотрю...
 
Gennady Mazur #:
Что касается места на диске, то свободных более 20 Гиг, диск SSD,
память загружена на 30-40%... на систему работают 3 ядра...
терминал отбирает всего 10-12% ресурсов системы и всего 100-120 метров памяти...
судя по формируемым файлам, они не очень то и большие, 30-50 кило...
да и записываться должны по идее моментально...

Спасибо, друзья...
пока добавил задержку - 1000 мсек... посмотрю...

У меня решилось так:

if ( !ChartScreenShot( screen_chart_id, img_name, 1024, 768 ) ) return;
ChartRedraw( screen_chart_id );

while ( !IsStopped() )
{
        if ( FileIsExist( img_name ) )
        {
                int h = FileOpen( img_name, FILE_READ | FILE_WRITE | FILE_BIN );
                if ( h >= 0 )
                {
                        int file_size = (int)FileSize( h );
                        FileClose( h );
                        if ( file_size > 0 ) break;
                }
        }
        Sleep(10);
}
 
Andrey Khatimlianskii #:

У меня решилось так:

То есть причина в флаге с SHARE?
 Хм, интересно.

 
Andrey Khatimlianskii #:

У меня решилось так:

Да, очень интересное решение...
Единственно, зачем перезапускать процесс при не получении скрина?
По идее, скрин снимется с экрана в любом случае,
проблема лишь в том, успеет ли он записаться на диск до того, как мы к нему обратимся....
или я не прав?

 
Gennady Mazur #:

Да, очень интересное решение...
Единственно, зачем перезапускать процесс при не получении скрина?
По идее, скрин снимется с экрана в любом случае,
проблема лишь в том, успеет ли он записаться на диск до того, как мы к нему обратимся....
или я не прав?

Скриншот один раз снимается, потом в цикле идет ожидание завершения сохранения. После цикла делать отправку.

 
Подправил код до такого вида и
        string filename=StringFormat("%s%d.gif",symbol,period);
        while(IsTradeContextBusy()) Sleep(10);
        if(ChartScreenShot(chart_id,filename,960,960,ALIGN_RIGHT))
        {
          while(!IsStopped())
          {
            if(FileIsExist(filename))
            {
              int h=FileOpen(filename,FILE_READ|FILE_WRITE|FILE_BIN);
              if(h>=0)
              {
                int file_size=(int)FileSize(h);
                FileClose(h);
                if(file_size>0) break;
              }
            }
            Sleep(10);
          }          
          if(FileIsExist(filename))
          {
            Print("ScreenShot "+filename);
            string _caption=Base_ChartScreen[i].caption;
            string screen_id;
            int res=MyBot.SendPhoto(screen_id,Input_ChannelName,filename,_caption);
            if(res==0)
            {
              Print("ScreenShot send "+filename);            
              Base_ChartScreen[i].screen=false;
              if(FileIsExist(filename)) FileDelete(filename);
            }
            else Print("Send ScreenShot error: ",GetErrorDescription(res));
          }
        }
поставил на проверку
 
Andrey Khatimlianskii #:

У меня решилось так:

Да, Ваш вариант действительно работает очень качественно и без задержек, которые есть при применении Sleep() , и почти не грузит терминал.
Большое спасибо за помощь