Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Windows Forms
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.08.2010, 20:24   #1
Flay
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 26
По умолчанию Thread в Windows From Application

Прошу Вашей помощи в разборке использования thread в WFA.
у меня такая проблема. Создаю thread в UPDATE классе:
Код:
hthrSocketRead = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)LoadRevision, this, NULL, &thrSocketRead);
Функция thread:
Код:
DWORD WINAPI UPDATE::LoadRevision(LPVOID Send)
{
	GetCurrentDirectory(256, Send->currentdir);
}
В таком случае MS VS 2010 выдает ошибку:
error C2039: 'hInetfile' : is not a member of 'System::Void'

Если Send->currentdir заменить на просто currentdir:
error C2597: illegal reference to non-static member 'UPDATE::hInetfile'

Если же переменную hInetfile сделать статической:
Код:
static HINTERNET		hInetfile;
То вылазит ошибка:
Update.obj : error LNK2001: unresolved external symbol "public: static void * UPDATE::hInetfile" (?hInetfile@UPDATE@@2PAXA)

Помогите решить проблемму пожалуйста
Flay вне форума Ответить с цитированием
Старый 22.08.2010, 20:33   #2
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Код:
LPVOID Send
У вас тип данных LPVOID - *void а значит указатель ни на что )) т.е. вам стоит сделать так
Код:
((MyStructure*)Send)->MyStructureMember
- приведение типов данных
BOBAH13 вне форума Ответить с цитированием
Старый 22.08.2010, 22:58   #3
Flay
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 26
По умолчанию

Цитата:
Сообщение от BOBAH13 Посмотреть сообщение
Код:
LPVOID Send
У вас тип данных LPVOID - *void а значит указатель ни на что )) т.е. вам стоит сделать так
Код:
((MyStructure*)Send)->MyStructureMember
- приведение типов данных
спасибо, скомпилилось все без ошибок, но почему то значения:
((UPDATE*)Send)->status
и
status
разные при отладке показывает структуру this, в которой присутствует переменная hInetfil равная должному значению = 1. При наведении же на hInetfil в редакторе, показывает другое значение (87546768) и далее все выполняется с неверным значением.
при выполнении:
int st = ((UPDATE*)Send)->status;

st становится равным 87546768

Последний раз редактировалось Flay; 22.08.2010 в 23:25.
Flay вне форума Ответить с цитированием
Старый 23.08.2010, 22:32   #4
Flay
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 26
По умолчанию

помогите пожалуйста знающие эксперты. вся надежда на Вас. ну никак не могу разобраться в этом :-(
такое очучение что он передает адрес переменной, а не переменную. как получить переменную? вариант с __asm меня не очень устраивает

Последний раз редактировалось Flay; 23.08.2010 в 22:34.
Flay вне форума Ответить с цитированием
Старый 24.08.2010, 13:53   #5
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Ну так показывайте полный пример, что куда и как шлете и вызываете ?
BOBAH13 вне форума Ответить с цитированием
Старый 24.08.2010, 18:14   #6
Flay
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 26
По умолчанию

form1.h:
Код:
#pragma once
#include "Update.h"
Start run;
namespace Launcher {

	using namespace System;
	using namespace System::ComponentModel;
	using namespace System::Collections;
	using namespace System::Windows::Forms;
	using namespace System::Data;
	using namespace System::Drawing;

	/// <summary>
	/// Summary for Form1
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		Form1(void)
		{
			InitializeComponent();
			//
			//TODO: Add the constructor code here
			//

		}
...
	public: 

		void test()
		{
			UPDATE			upd;
			upd.StartUpdate(button1, uptext, progress);
		}
...

private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
			 test();
		 }
update.h:
Код:
#pragma once
#include <Windows.h>
#include <Wininet.h>
#include <zlib.h>
#include "hash_md5.h"

class UPDATE
{
public:
	void StartUpdate(System::Windows::Forms::Button^ but, System::Windows::Forms::Label^ text, System::Windows::Forms::PictureBox^ progress);

	int			status;
...
	static DWORD WINAPI UPDATE::LoadRevision(LPVOID Send);
update.cpp
Код:
void UPDATE::StartUpdate(System::Windows::Forms::Button^ but, System::Windows::Forms::Label^ text, System::Windows::Forms::PictureBox^ progress)
{
		hthrSocketRead = CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)LoadRevision, this, NULL, &thrSocketRead);
}
...
DWORD WINAPI UPDATE::LoadRevision(LPVOID Send)
{
		int st = ((UPDATE*)Send)->status;
...
Flay вне форума Ответить с цитированием
Старый 24.08.2010, 18:37   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Код:
DWORD WINAPI UPDATE::LoadRevision(LPVOID Send)
{
    UPDATE *update = (UPDATE*)Send; // тут можете проверить update
    int st = update->status;
Все верно. Если не работает, внимательней подойдите к коду и проверьте логику еще раз.
BOBAH13 вне форума Ответить с цитированием
Старый 24.08.2010, 21:28   #8
Flay
Пользователь
 
Регистрация: 22.08.2010
Сообщений: 26
По умолчанию

Всё перепроверил. Адрес передается верный. Но как будто что то изменяет переменные, хотя нигде кроме как в thread больше нет обращений к переменным класса update.

разобрался с этой бедо наконец.
просто вынес определение класса из файла from.h и теперь все работает

Последний раз редактировалось Flay; 25.08.2010 в 00:55.
Flay вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Книга по Windows Form Application Skynet91 Общие вопросы C/C++ 0 20.03.2010 08:51
Создание приложений Windows Application Александр Елис Помощь студентам 6 20.10.2009 22:24
Windows Forms Application Cdevelop Общие вопросы .NET 1 15.03.2009 18:03