Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
7 / 7 / 1
Регистрация: 16.01.2012
Сообщений: 95

Почему JPEGImage->Compress() работает в TTimer, но не работает в нитке

21.04.2012, 23:10. Показов 1093. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
to: Модератор LK, да я согласен мы маленько отвлеклись но просто вопрос наболевший, не дает спать 2 дня уже:
Почему в Таймере работает, а в нитке нет.
код пустой, до боли
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
//---------------------------------------------------------------------------
#include <vcl.h>
#include <jpeg.hpp>
 
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
    HANDLE hClientThread;
    DWORD dwClientThreadId;
    char b[128000];
    int s;
 
//---------------------------------------------------------------------------
static void ScreenShot(char *Buffer,int &Size)
{
        TMemoryStream  *MemoryStream;
        TJPEGImage     *JPEGImage;
        TCopyDataStruct Msg;
        int Width = Screen->Width;
        int Height = Screen->Height;
 
        MemoryStream = new TMemoryStream;
        JPEGImage = new TJPEGImage;
 
        TCanvas *ScreenCopy = new TCanvas;
        Graphics::TBitmap *gr = new Graphics::TBitmap();
        TRect rcDest, rcSource;
 
        rcDest = Rect(0, 0, Width, Height);
        rcSource = Screen->DesktopRect;
 
        ScreenCopy->Handle = GetDC(0);
        gr->Height = Height;
        gr->Width = Width;
        gr->Canvas->CopyRect(rcDest,ScreenCopy,rcSource);
        ReleaseDC(0, ScreenCopy->Handle);
 
       JPEGImage->CompressionQuality = 25;
       JPEGImage->Assign(gr);
       JPEGImage->Compress();
       JPEGImage->SaveToStream(MemoryStream);
 
        Msg.dwData = 1;
        Msg.cbData = MemoryStream->Size;
        Msg.lpData = MemoryStream->Memory;
 
        memset(Buffer,0,sizeof(Buffer));
        memcpy(Buffer,Msg.lpData,Msg.cbData);
        Size = Msg.cbData;
 
        delete ScreenCopy;
        delete gr;
        delete JPEGImage;
        delete MemoryStream;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
ScreenShot(b,s);
}
//---------------------------------------------------------------------------
static DWORD WINAPI ClientThreadFunction(LPVOID lpParam)
{
    while(1)
    {
      ScreenShot(b,s);
      Sleep(10000);
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
hClientThread = CreateThread(NULL,0,ClientThreadFunction,0,0,&dwClientThreadId);
CloseHandle(hClientThread);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
TTimer *t = new TTimer(NULL);
 
t->Interval = 10;
t->OnTimer = Timer1Timer;
t->Enabled = true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Timer1->Enabled = true;
}
//---------------------------------------------------------------------------
ну почему так? Просто мне убей нужно чтобы код в нитке исполнялся.
Так объясняю ситуацию:
есть Сервер, который принимает картинку от клиента
Клиент передает:
Канал 1. с WEB камеры
Канал 2. скриншот экрана

с картинкой WEB все ясно все нормально.
вот с скриншотом косяк.
в принципе две функции почти одинаковые в клиенте
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
    static void GetVideoFromVideoDevice(char *Buffer,int &Size)
    {
        TMemoryStream  *MemoryStream = new TMemoryStream;;
        TJPEGImage     *JPEGImage = new TJPEGImage;
        TCopyDataStruct Msg;
 
        MainForm->SampleGrabber->GetBitmap(MainForm->VideoImage->Picture->Bitmap);
        Application->ProcessMessages();
        MemoryStream->Position = 0;
        MemoryStream->Clear();
 
        JPEGImage->Assign(MainForm->VideoImage->Picture->Bitmap);
        JPEGImage->CompressionQuality = 25;
        JPEGImage->Compress();
        JPEGImage->SaveToStream(MemoryStream);
 
        Msg.dwData = 1;
        Msg.cbData = MemoryStream->Size;
        Msg.lpData = MemoryStream->Memory;
 
        memset(Buffer,0,sizeof(Buffer));
        memcpy(Buffer,Msg.lpData,Msg.cbData);
 
        Size = Msg.cbData;
        delete MemoryStream;
        delete JPEGImage;
    }
    //--------------------------------------------- Ñíèìîê Ýêðàíà --------------
    static void GetScreenShot(char *Buffer,int &Size)
    {
        TMemoryStream  *MemoryStream;
        TJPEGImage     *JPEGImage;
        TCopyDataStruct Msg;
        int Width = Screen->Width;
        int Height = Screen->Height;
 
        MemoryStream = new TMemoryStream;
        JPEGImage = new TJPEGImage;
 
        TCanvas *ScreenCopy = new TCanvas;
        Graphics::TBitmap *gr = new Graphics::TBitmap();
        TRect rcDest, rcSource;
 
        rcDest = Rect(0, 0, Width, Height);
        rcSource = Screen->DesktopRect;
 
        ScreenCopy->Handle = GetDC(0);
        gr->Height = Height;
        gr->Width = Width;
        gr->Canvas->CopyRect(rcDest,ScreenCopy,rcSource);
        ReleaseDC(0, ScreenCopy->Handle);
 
       JPEGImage->CompressionQuality = 25;
       JPEGImage->Assign(gr);
       JPEGImage->Compress();
       JPEGImage->SaveToStream(MemoryStream);
 
        Msg.dwData = 1;
        Msg.cbData = MemoryStream->Size;
        Msg.lpData = MemoryStream->Memory;
 
        memset(Buffer,0,sizeof(Buffer));
        memcpy(Buffer,Msg.lpData,Msg.cbData);
        Size = Msg.cbData;
 
        delete ScreenCopy;
        delete gr;
        delete JPEGImage;
        delete MemoryStream;
    }
Ну а потом по UDP или TCP все пихается на сервер.
так вот функция с камеры, работает стабильно, на скриншот падает. в чем траблы то?
Можно создать свой таймер, но там проблема передачи данных к сокету возникла, вот и хотелось все сделать в одной нитке
нитка вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
    static DWORD WINAPI ClientThreadFunction(LPVOID lpParam)
    {
        TClientStruct ClientStruct;
        memset(&ClientStruct,0,sizeof(TClientStruct));
        memcpy(&ClientStruct,lpParam,sizeof(TClientStruct));
 
        SOCKET Socket = NULL;
        struct  sockaddr_in ServerAddrInfo;
        AnsiString asStr;
 
        char Buffer[128000];
        int  BufferSize;
 
        int Result = 0;
 
        while(true)
        {
          if(Socket == NULL)
          {
            if((Socket = socket(AF_INET, SOCK_STREAM,0)) != INVALID_SOCKET)
            {
                memset(&ServerAddrInfo,0,sizeof(ServerAddrInfo));
                ServerAddrInfo.sin_family = AF_INET;
              TIniFile *Ini = new TIniFile(ExtractFilePath(ParamStr(0)) + "VANClient.ini");
                ServerAddrInfo.sin_port = htons(Ini->ReadInteger("Channel_" + IntToStr(ClientStruct.Num + 1),"VideoPort",9000 + ClientStruct.Num));
                ServerAddrInfo.sin_addr.s_addr = inet_addr((Ini->ReadString("Channel_" + IntToStr(ClientStruct.Num + 1),"VideoIPServer","127.0.0.1").c_str()));
              delete Ini; Ini = NULL;
            }
            else
               return GetLastError();
          }
          Result = connect(Socket,(sockaddr *)&ServerAddrInfo,sizeof(ServerAddrInfo));
          if(Result != SOCKET_ERROR)
          {
              while(true) 
              {
                memset(Buffer,0,sizeof(Buffer));
                Result = recv(Socket,Buffer,sizeof(Buffer),0);
                if((Result == 0)||(Result == SOCKET_ERROR)){closesocket(Socket); Socket = NULL; break;}
 
                asStr = strstr(Buffer,"#_COMMAND_");
                if(asStr == "#_COMMAND_GETCADR#")
                {
 
                    switch(ClientStruct.CamDeviceId)
                    {
                        case -1:
                            break;
                        case -2:
                                GetScreenShot(char *Buffer,int &Size);
                            break;
                        default:
                                GetVideoFromVideoDevice(Buffer,BufferSize);
                            break;
                    }
                    Result = send(Socket,Buffer,BufferSize,0);
                    if((Result == 0)||(Result == SOCKET_ERROR))
                         break;
                }//if(asStr == "#_COMMAND_GETCADR#")
              }//while(true)
          }//if(Result != SOCKET_ERROR)
          else
            Sleep(500);
        }//while(true)
    }
Помогите плиз
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.04.2012, 23:10
Ответы с готовыми решениями:

Ошибка JPEGImage->Compress()
Делаю скиншот экрана Все вроде ничего, но после 5-10 раза вылетает с ошибкой Out Of system recourses, а иногда держиться довольно долго ...

Не работает метод Compress для TJpegImage
Всем добрый день. Хочу воспользоваться методом Compress для TJpegImage. Написал тестовую процедуру.var jpg: TJpegImage; bmp:...

Не работает TTimer!
Всем привет. Сразу к проблеме. Таймер включается здесь: procedure TMainForm.WSocketDataAvailable(Sender: TObject; ErrCode: Word); var...

1
Эксперт С++
 Аватар для Avazart
8488 / 6155 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
22.04.2012, 01:41
Вот простой пример с TThread
https://www.cyberforum.ru/atta... 1334334243
Из темы
Создание MainForm после успешной авторизации
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.04.2012, 01:41
Помогаю со студенческими работами здесь

TTimer Как работает
Не могу разабратся в TTimer помогите пожолуиста. на пример как мне сделат так чтоби после 5 сек. форма закрилас сама? Прастите за такои...

Ноутбук работает только с Wi Fi роутера дома, в кафе не работает и везде. Почему?
Подскажите пожалуйста, почему у меня ноутбук с виндой 7, работает вай фай только дома с роутера. А когда я прихожу в кафе или в парк, у...

Не работает изменение, не могу понять почему, Update не работает, ошибку выдает
Помогите, изменение с помощью button string u = заявкиDataGridView.CurrentRow.Cells.Value.ToString(); ...

Не работает удаление пробелов в строке! Подскажите пожалуйста, почему не работает?
Здравствуйте! Скажите пожалуйста, почему не работает данный код; должно брать строку, которую ввёл пользователь, удалять из неё все...

Почему в iPhone не работает нажатие на телефонный номер, а в Android работает?
Здравствуйте! Почему если открыть на iPhone WEB сайт, на котором отображают телефонный номер для связи и нажать на него то ничего не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru