Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Языки программирования (http://mangos.ytdb.ru/forumdisplay.php?f=34)
-   -   Прогресс загрузки (http://mangos.ytdb.ru/showthread.php?t=6932)

Visible 02.04.2013 08:06

Прогресс загрузки
 
Всем доброе время суток. Я только недавно начал изучать С++, сильно не ругайте, просто действительно не первый день мучаюсь, невыходит.
каким образом можно реализовать прогресс загрузки архива? Работаю в билдере6. Да есть опция прогресс бара, но скачивание происходит по нажатию кнопки. Каким образом можно вызвать модальное окно с загрузкой в прогрессбар? Скачиваю архив таким образом:
Код:

TFileStream* fs = new TFileStream("имя_архива_на диске.zip", fmCreate|fmOpenWrite); //
IdHTTP1->Get("http://site.com/имя_архива_на_сервере.zip", fs);
delete fs;
// далее идет извлечение архива и другие действия


Sid 02.04.2013 08:14

Цитата:

Сообщение от Visible (Сообщение 30999)
Работаю в билдере6.

И это печально.
По существу, прогресс загрузки это событийный процесс. Например в Qt прогрессбар привязывается к событию onDataAvailable() в котором передается размер полученых данных и полный размер итоговых данных. Из которых вычисляется размерность прогрессбара и его заполнение при получении данных. Думаю в билдере точно так же только со своими тараканами. Ищите привязку по событию.

Visible 02.04.2013 08:36

Цитата:

Сообщение от Sid (Сообщение 31000)
И это печально.
По существу, прогресс загрузки это событийный процесс. Например в Qt прогрессбар привязывается к событию onDataAvailable() в котором передается размер полученых данных и полный размер итоговых данных. Из которых вычисляется размерность прогрессбара и его заполнение при получении данных. Думаю в билдере точно так же только со своими тараканами. Ищите привязку по событию.

а qt5.0 для студии 2010 подойдет для студии 2012?(сейчас установлена 2012 студия) или лучше версия с minGW? О qt раньше не знал. поэтому поставил билдер. Пока помучаю билдер, попробую вывести прогрессбар. Спасибо за совет :)

Evgeniy 02.04.2013 09:02

Цитата:

Сообщение от Visible (Сообщение 31001)
а qt5.0 для студии 2010 подойдет для студии 2012?(сейчас установлена 2012 студия) или лучше версия с minGW? О qt раньше не знал. поэтому поставил билдер. Пока помучаю билдер, попробую вывести прогрессбар. Спасибо за совет :)

qt-фреймверк, билдер - IDE
странное сравнение...
Прогрессбар, используя винапи, можно сделать на чем угодно. На qt - кроссплатформенно. Тебе бы на другой форум( либо книжками завалится), поближе к своей тематике.

Visible 02.04.2013 09:50

Цитата:

Сообщение от Evgeniy (Сообщение 31002)
qt-фреймверк, билдер - IDE
странное сравнение...
Прогрессбар, используя винапи, можно сделать на чем угодно. На qt - кроссплатформенно. Тебе бы на другой форум( либо книжками завалится), поближе к своей тематике.

я их не сравнивал и не собираюсь сравнивать. Установил qt5_mingw создал проект(пустой) запустил с ctrl+R запустилось, нашел собраный exe в debug пытаюсь запустить оттуда "Системная ошибка, qt5Cored.dll не найден, мол переустанавливай)" О_о.
ЗЫ. Понравилась интеграция с git, mercurial и т.п. Удобно сделано =)

Sid 02.04.2013 09:58

Цитата:

Сообщение от Evgeniy (Сообщение 31002)
qt-фреймверк, билдер - IDE
странное сравнение...
Прогрессбар, используя винапи, можно сделать на чем угодно. На qt - кроссплатформенно. Тебе бы на другой форум( либо книжками завалится), поближе к своей тематике.

Я знаю в чем разница. Вы я смотрю язвить мостак. По существу ничем не ответили человеку, троли на другом форуме тоже, если уж на то пошло.

Добавлено через 4 минуты
Цитата:

Сообщение от Visible (Сообщение 31003)
я их не сравнивал и не собираюсь сравнивать. Установил qt5_mingw создал проект(пустой) запустил с ctrl+R запустилось, нашел собраный exe в debug пытаюсь запустить оттуда "Системная ошибка, qt5Cored.dll не найден, мол переустанавливай)" О_о.
ЗЫ. Понравилась интеграция с git, mercurial и т.п. Удобно сделано =)

Не найден, потому что надо в папку с программой положить. Он требует библиотеки для запуска. Если будете на Qt писать, то вот пример. Я как-то заморачивался по поводу автообновления, написал скачку файла с прогрессбаром.

https://bitbucket.org/sidsukana/qsw/...orm.cpp#cl-143

Функция void SWUpdateForm::updateSoftware()

Прошу прощения, событие называется downloadProgress() но сути это не меняет. Оно привязывается к слоту, в котором идет обновление показания прогресс бара на основе полученных данных.

Visible 02.04.2013 10:15

Цитата:

Сообщение от Sid (Сообщение 31004)
Я знаю в чем разница. Вы я смотрю язвить мостак. По существу ничем не ответили человеку, троли на другом форуме тоже, если уж на то пошло.

Добавлено через 4 минуты


Не найден, потому что надо в папку с программой положить. Он требует библиотеки для запуска. Если будете на Qt писать, то вот пример. Я как-то заморачивался по поводу автообновления, написал скачку файла с прогрессбаром.

https://bitbucket.org/sidsukana/qsw/...orm.cpp#cl-143

Функция void SWUpdateForm::updateSoftware()

Прошу прощения, событие называется downloadProgress() но сути это не меняет. Оно привязывается к слоту, в котором идет обновление показания прогресс бара на основе полученных данных.

Большое спасибо, буду разбираться.
Сейчас пробывал создать второй (пустой) проект, так даже в откладке теперь запускать нехочет( хотя первый созданный запустился.
Код:

Не удалось запустить программу. Путь или права недопустимы?
C:\Users\Admin\Desktop\asd\asd-build\debug\Updater.exe завершился с кодом -1

Ещё заметил, проект в билдере (с разными функциями в меню) после сборки занимает почти 500 кб пространства. а тут, полностью пустой уже 650 кб

Evgeniy 02.04.2013 11:03

Цитата:

Сообщение от Sid (Сообщение 31004)
Я знаю в чем разница. Вы я смотрю язвить мостак. По существу ничем не ответили человеку, троли на другом форуме тоже, если уж на то пошло.

По существу я написал о винапи, а если конкретно - стандартных контролах виндовса. В интернете валом информации как это сделать на С++, С и Delphi и т.д. Это будет не просто - но скорость работы и размер скомпилированого приложения радует.
Посмотрите другие созданные темы пользователя Visible. Человек учится работать в билдере...и это печально. Единственно адекватный способ сделать процесс использования такого приложения проще - использовать винапи. Конкретно - не надо будет качать и таскать борландовские библиотеки( встроенные контролы).
Цитата:

Сообщение от Sid (Сообщение 31004)
прогресс загрузки это событийный процесс

Процесс загрузки - такой каким его напишет программист. Если в qt используется событийная модель и обертка вокруг процесса загрузки, то это не значит, что так везде.
зы линк на попытки человека сделать в билдере http://www.programmersforum.ru/showthread.php?t=187852
ззы мне удобнее использовать wget для закачки файлов - существует и для виндовса. Показывает прогрессбар. Если целью автора ставится изучение с++ как такового, то все же я бы советовал прочитать книги или пройти онлайн курсы в интернете.
Код не мой, собрал - работает (gcc -mwindows -s main.cpp -Wall -O3 -o main.exe 10кб)
ззы
Код:

#include <windows.h>
#include <commctrl.h>
 
#define PBS_MARQUEE    0x08
#define PBS_SMOOTH  1
#define PBS_SMOOTHREVERSE 0x10
#define COLOR_3DFACE 15
#define PBM_SETMARQUEE  (WM_USER + 10)
 
LRESULT CALLBACK Func(HWND, UINT, WPARAM, LPARAM);
INT registerWindow(PCSTR , WNDPROC ,                HBRUSH );
 
HINSTANCE hInstanceProgram;
HWND hWndProgressBar, hWndMain;
 
INT WINAPI
WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                LPSTR lpszArgument, INT nFunsterStil)
{
        MSG message;
 
    hInstanceProgram = hInstance;
        if (registerWindow("MyClass", Func,
                        GetSysColorBrush(COLOR_3DFACE)))
                return 0;
        hWndMain = CreateWindowEx(0, "MyClass",
                        "Progress Bar", WS_CAPTION | WS_SYSMENU
                        | WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
                        NULL, NULL, hInstance, NULL);
        ShowWindow(hWndMain, nFunsterStil);
 
    while (GetMessage(&message, NULL, 0, 0))
        {
                TranslateMessage(&message);
                DispatchMessage(&message);
        }
 
        return message.wParam;
}
 
INT registerWindow(PCSTR lpszClassName, WNDPROC lpfnWndProc,
                HBRUSH hbrBackground)
{
        WNDCLASSEX wndClassEx;
 
        ZeroMemory(&wndClassEx, sizeof(WNDCLASS));
 
        wndClassEx.hInstance = hInstanceProgram;
        wndClassEx.lpszClassName = lpszClassName;
        wndClassEx.lpfnWndProc = lpfnWndProc;
        wndClassEx.style = CS_DBLCLKS;
        wndClassEx.cbSize = sizeof(WNDCLASSEX);
        wndClassEx.hIcon = NULL;
        wndClassEx.hIconSm = NULL;
        wndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW);
        wndClassEx.lpszMenuName = NULL;
        wndClassEx.cbClsExtra = 0;
        wndClassEx.cbWndExtra = 0;
        wndClassEx.hbrBackground = hbrBackground;
 
        if (RegisterClassEx(&wndClassEx))
                return 0;
 
        return 1;
}
 
LRESULT CALLBACK Func(HWND hWnd, UINT message,
                WPARAM wParam, LPARAM lParam)
{
        switch (message)
        {
                case WM_CREATE:
            hWndProgressBar = CreateWindowEx(0, PROGRESS_CLASS,
                          "", WS_CHILD | WS_VISIBLE | PBS_MARQUEE |PBS_SMOOTHREVERSE, 148, 8, 160, 16, hWnd, NULL,
                      hInstanceProgram, NULL);
                    SetTimer(hWnd, 1, 100, NULL);
            SendMessage(hWndProgressBar, PBM_SETMARQUEE, TRUE, 100);
                        break;
                case WM_DESTROY:
            KillTimer(hWnd, 1);
                        PostQuitMessage(0);
                        break;
                case WM_TIMER:
            SendMessage(hWndProgressBar, PBM_STEPIT, 0, 0);
            break;
                default:
                        return DefWindowProc(hWnd, message, wParam, lParam);
        }
 
    return 0;
}


Visible 02.04.2013 14:54

Цитата:

Сообщение от Sid (Сообщение 31004)
Не найден, потому что надо в папку с программой положить. Он требует библиотеки для запуска.

Попробовал пособирать различные программы, ни одна не работает без библиотек. Это же очень неудобно, "таскать их с собой". Есть же наверно какой то выход? другие приложения собранные в других компиляторах работают без доп. библиотек.

lovepsone 02.04.2013 16:56

Да, есть.... Собрать заново проект Qt (на сайте можно скачать surse code), и линковать библиотечки статически. Прочитать про это можно тут тык! Я правда пока сам не пробовал, но мне Qt 4.8 нравится больше чем Qt 5, так как в Qt 5 еще больше библиотечек надо пихать с прогой.

Visible 02.04.2013 17:29

Цитата:

Сообщение от lovepsone (Сообщение 31009)
Да, есть.... Собрать заново проект Qt (на сайте можно скачать surse code), и линковать библиотечки статически. Прочитать про это можно тут тык! Я правда пока сам не пробовал, но мне Qt 4.8 нравится больше чем Qt 5, так как в Qt 5 еще больше библиотечек надо пихать с прогой.

Вы не подскажете где можно более старые версии взять qt?

Уже нашел, ненадо :)

Sid 04.04.2013 19:49

Если статически линковать либы с бинарником, то его размер будет катастрофических размеров :)

lovepsone 05.04.2013 15:07

Цитата:

Сообщение от Sid (Сообщение 31045)
Если статически линковать либы с бинарником, то его размер будет катастрофических размеров :)

Ну это минусы Qt'a... Зато плюсы у него большие... Хотя вы сами знаете... Ваша разработка по спеллворку меня подбила на Qt, за это вам спасибо!

Visible 05.04.2013 15:19

Цитата:

Сообщение от lovepsone (Сообщение 31055)
Ну это минусы Qt'a... Зато плюсы у него большие... Хотя вы сами знаете... Ваша разработка по спеллворку меня подбила на Qt, за это вам спасибо!

а я все таки решил на VSE пользоваться как в старые добрые времена компилил мангос. Пусть нет IDE, но мне нравится. Чем сложнее учиться, тем лучше понимание. Как всегда.

Astoria 05.04.2013 16:17

Тогда уж и блокнот покатит. Максимум понимания.

Visible 05.04.2013 19:21

Цитата:

Сообщение от Astoria (Сообщение 31059)
Тогда уж и блокнот покатит. Максимум понимания.

Ну да. Единственное отличие VS все таки немного подсказывает тебе:yes3:


Текущее время: 01:24. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS