Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.
Внимание! Некоторое время письма не доходят до аккаунтов MAIL RU GROUP, не доходят на все почтовые ящики mail.ru, inbox.ru, bk.ru. Пишите им жалобы, чтобы быстрее восстановили получение писем, регистрируйтесь через яндекс почту и gmail, туда письма с активизацией доходят.

Вернуться   Форум программистов > .NET > Windows Forms
Регистрация

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

Ответ
 
Опции темы
Старый 22.08.2010, 20:24   #1
Flay
Пользователь
 
Регистрация: 22.08.2010
Адрес: Первоуральск
Сообщений: 26
Репутация: 10
По умолчанию 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
Адрес: Los Angeles, USA
Сообщений: 3,708
Репутация: 1457
По умолчанию

Код:

LPVOID Send

У вас тип данных LPVOID - *void а значит указатель ни на что )) т.е. вам стоит сделать так
Код:

((MyStructure*)Send)->MyStructureMember

- приведение типов данных
__________________
Home | Android for food | XWindows Dock | github
BOBAH13 вне форума   Ответить с цитированием
Старый 22.08.2010, 22:58   #3
Flay
Пользователь
 
Регистрация: 22.08.2010
Адрес: Первоуральск
Сообщений: 26
Репутация: 10
По умолчанию

Цитата:
Сообщение от 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
Репутация: 10
По умолчанию

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

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

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

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
Адрес: Los Angeles, USA
Сообщений: 3,708
Репутация: 1457
По умолчанию

Код:

DWORD WINAPI UPDATE::LoadRevision(LPVOID Send)
{
    UPDATE *update = (UPDATE*)Send; // тут можете проверить update
    int st = update->status;

Все верно. Если не работает, внимательней подойдите к коду и проверьте логику еще раз.
__________________
Home | Android for food | XWindows Dock | github
BOBAH13 вне форума   Ответить с цитированием
Старый 24.08.2010, 21:28   #8
Flay
Пользователь
 
Регистрация: 22.08.2010
Адрес: Первоуральск
Сообщений: 26
Репутация: 10
По умолчанию

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


00:20.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru