Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
46 / 46 / 15
Регистрация: 13.10.2012
Сообщений: 404
1

Как перенести функции из формы в поток

27.02.2015, 13:11. Просмотров 769. Ответов 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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
//---------------------------------------------------------------------------
 
#include <System.hpp>
#pragma hdrstop
 
#include "Unit2.h"
#include "Unit1.h"
#include <string>
#include "curl/curl.h"
 
#pragma comment(lib,"Mylib/My_curl.lib")
#pragma package(smart_init)
//---------------------------------------------------------------------------
 
//   Important: Methods and properties of objects in VCL can only be
//   used in a method called using Synchronize, for example:
//
//      Synchronize(&UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall virtotal::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
int procent=0;
 
 
__fastcall virtotal::virtotal(bool CreateSuspended)
    : TThread(CreateSuspended)
{
FreeOnTerminate = true;
}
//---------------------------------------------------------------------------
 
struct myprogress {
  double lastruntime;
  CURL *curl;
};
 
/* this is how the CURLOPT_XFERINFOFUNCTION callback works */
static int xferinfo(void *p,
                    curl_off_t dltotal, curl_off_t dlnow,
                    curl_off_t ultotal, curl_off_t ulnow)
{
  struct myprogress *myp = (struct myprogress *)p;
  CURL *curl = myp->curl;
  double curtime = 0;
 
  curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &curtime);
 
   if((dlnow !=0) && (dltotal !=0))
      procent = (dlnow*100)/dltotal;
   
   //вот здесь и выдает ошибку , 
   // E2268 Call to undefined function 'Synchronize'
   Synchronize(&process);
 
  return 0;
}
 
/* for libcurl older than 7.32.0 (CURLOPT_PROGRESSFUNCTION) */
static int older_progress(void *p,
                          double dltotal, double dlnow,
                          double ultotal, double ulnow)
{
  return xferinfo(p,
                  (curl_off_t)dltotal,
                  (curl_off_t)dlnow,
                  (curl_off_t)ultotal,
                  (curl_off_t)ulnow);
}
 
void virtotal::process()
{
   Form1->Label1->Caption = procent;
}
 
 
static size_t write(char *ptr, size_t size, size_t nmemb, std::string* data)
{
  if (data)
   {
     data->append(ptr, size*nmemb);
     return size*nmemb;
   }
  else return 0;  // будет ошибка
}
 
 
int probaprogressSsaita ()
{
 
  // Открываем файлы для заголовка и тела
 
  CURL *curl;
  CURLcode res = CURLE_OK;
  struct myprogress prog;
   std::string content;
  curl = curl_easy_init();
  if(curl) {
    prog.lastruntime = 0;
    prog.curl = curl;
 
    curl_easy_setopt(curl, CURLOPT_URL, "http://aihdownload.adobe.com/bin/live/install_flashplayer15x32au_mssa_aaa_aih.exe");
 
    curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, older_progress);
    /* pass the struct pointer into the progress function */
    curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, &prog);
#if LIBCURL_VERSION_NUM >= 0x072000
    curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferinfo);
    /* pass the struct pointer into the xferinfo function, note that this is
       an alias to CURLOPT_PROGRESSDATA */
    curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &prog);
#endif
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
   //   curl_easy_setopt(curl, CURLOPT_WRITEHEADER, headerfile);
    res = curl_easy_perform(curl);
 
    if(res != CURLE_OK)
      //printf(stderr, "%s\n", curl_easy_strerror(res));
      Form1->Memo1->Lines->Add(curl_easy_strerror(res));
    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  return (int)res;
}
 
 
void __fastcall virtotal::Execute()
{
    //---- Place thread code here ----
}
//---------------------------------------------------------------------------
Мне выдает ошибку
C++
1
2
3
4
//вот здесь и выдает ошибку , 
   // E2268 Call to undefined function 'Synchronize'
   //строка 58
   Synchronize(&process);
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.02.2015, 13:11
Ответы с готовыми решениями:

Как из одной формы данные в Edit перенести?
У меня в одной форме данные из разных вкладок(Pages),при чем если активна одна вкладка из всех и...

Как перенести функцию в поток
Привет всем, я новичок в C# начал изучать потоки. Помогите пожалуйста перевести ниже привёднный код...

Как перенести рендер в другой поток
Нужно перенести весь процесс рендера в отдельный поток а саму геймформу не трогать. Ибо геймформа...

Создать поток сжатия GZipStream, и перенести данные из открытого файла в поток GZipStream
Здравствуйте. Объясните мне пожалуйста следующую вещь: Необходимо открыть файл для чтения. Создать...

2
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
30849 / 20174 / 7871
Регистрация: 22.10.2011
Сообщений: 35,016
Записей в блоге: 6
27.02.2015, 13:19 2
Synchronize - метод класса TThread. И вызываться должен из тела наследника этого метода, то есть, например, из virtotal::Execute(), а не из простой callback-функции.
1
46 / 46 / 15
Регистрация: 13.10.2012
Сообщений: 404
27.02.2015, 13:27  [ТС] 3
А как же мне перенести прогресс загрузки, он передается через callback?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.02.2015, 13:27

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Как перенести значения из одного компонента одной формы в другой компонент другой формы?
В общем ситуация смешная для профи,делаю программу для редактирования и печати вкладышей для...

Как завершить поток из другой формы?
Имеется поток запущенный в Form1: Thread Worker = new Thread(Work); ...

Как перенести данные формы в excel?
Нужно сделать так, что б данные формы падали в заготовленные места в шаблонной таблице, и готовый...

Как перенести данные с формы на форму
у меня есть 2 формы на первой textbox1 и button на второй label1 как сделать так что бы, я вводил...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.