Отправляет email-рассылки с помощью сервиса Sendsay

RFpro.ru: Microsoft .NET

  Все выпуски  

RFpro.ru: Microsoft .NET


РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты в разделе

solowey
Статус: Студент
Рейтинг: 145
∙ повысить рейтинг »
CradleA
Статус: Профессор
Рейтинг: 41
∙ повысить рейтинг »
Степанов Иван /REDDS
Статус: 4-й класс
Рейтинг: 26
∙ повысить рейтинг »

∙ .NET Framework / C# / Java

Номер выпуска:295
Дата выхода:26.11.2018, 00:15
Администратор рассылки:Коцюрбенко Алексей aka Жерар (Мастер-Эксперт)
Подписчиков / экспертов:21 / 16
Вопросов / ответов:3 / 5

Консультация # 158395: Уважаемые эксперты! Такой вопрос: следующая конструкция (Visual Basic.NET) myHttpWebResponse = myHttpWebRequest.GetResponse() Dim myStreamReader = New StreamReader(myHttpWebResponse.GetResponseStream, Encoding.GetEncoding(1251)) Docum1 = myStreamReader.ReadToEnd хорошо работает, если сервер отвечает быстро. Если сервер перегружен – п...
Консультация # 29755: Здравствйте, Jadd. Я по поводу вопроса о LoadIcon. Проблема у меня и состоит как раз в том, что я не могу найти ID иконки с изображением папки, всистеме. ведь она лежит в .dll. Поэтому мне нужно узнать какой ID у такой иконки. Спасибо. ..
Консультация # 164189: Как в Visual NET C++ обратиться к форме из не основного потока ?...

Консультация # 158395:

Уважаемые эксперты!
Такой вопрос: следующая конструкция (Visual Basic.NET)
myHttpWebResponse = myHttpWebRequest.GetResponse()
Dim myStreamReader = New StreamReader(myHttpWebResponse.GetResponseStream, Encoding.GetEncoding(1251))
Docum1 = myStreamReader.ReadToEnd
хорошо работает, если сервер отвечает быстро. Если сервер перегружен – приложение зависает секунд на 30 до получения ответа сервера. Проблему не решает ни это:
Do
Application.DoEvents()
Docum1 = Docum1 + myStreamReader.ReadLine
Loop Until myStreamReader.EndOfStream
Ни это:
Do
Application.DoEvents()
Docum1 = Docum1 + Chr(myStreamReader.Read)
Loop Until myStreamReader.EndOfStream
Пробовал помещать этот блок на отдельную форму – тот же результат.
Как быть?
Заранее, спасибо, Игорь.

Дата отправки: 22.01.2009, 02:23
Вопрос задал: Фидаков
Всего ответов: 2
Страница онлайн-консультации »


Консультирует Иоффе Мэир Вэлевич:

Здравствуйте, Фидаков!

Используйте потоки.

Обратите пристальное внимание на пространство имён System.Threading.

Создайте какой-нибудь backgroundworkerprocess и работайте с ним.

Удачи.

Консультировал: Иоффе Мэир Вэлевич
Дата отправки: 22.01.2009, 20:25
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Jan:

Здравствуйте, Фидаков!

Application.DoEvents() - точно не поможет, поскольку приложение виснет именно на myStreamReader.Read, то есть до Application.DoEvents() не доходит.
Если использование HttpWebRequest не принципиально и задча только в том, что вы написали то посоветую использовать System.Net.WebClient с асинхронными функциями, если же нужен именно такой способ, то присоединяясь к предыдущему эксперту посоветую использовать класс System.ComponentModel.BackgroundWorker, если не хочется возиться с System.Treading.

Консультировал: Jan
Дата отправки: 22.01.2009, 22:16
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 29755:

Здравствйте, Jadd.
Я по поводу вопроса о LoadIcon.
Проблема у меня и состоит как раз в том, что я не могу найти
ID иконки с изображением папки,
всистеме. ведь она лежит в .dll.
Поэтому мне нужно узнать какой ID у такой иконки.
Спасибо.

Дата отправки: 18.11.2005, 09:26
Вопрос задал: Santey
Всего ответов: 2
Страница онлайн-консультации »


Консультирует Ataman N. N.:

Здравствуйте, Santey!
Советую Вам достать программу Microangelo. С помощью данной программы можно просматривать иконки и в dll и в exe, а также узнавать их IDD.

Консультировал: Ataman N. N.
Дата отправки: 18.11.2005, 11:23
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Консультирует Jadd:

Здравствуйте, Santey!
Вот тут статья. Почитай. Там же есть и другие статьи. http://www.codeguru.com/Cpp/W-P/dll/article.php/c3653/

Консультировал: Jadd
Дата отправки: 18.11.2005, 16:31
Рейтинг ответа:

НЕ одобряю 0 одобряю!

Консультация # 164189:

Как в Visual NET C++ обратиться к форме из не основного потока ?

Дата отправки: 05.04.2009, 16:07
Вопрос задал: Юрий Анатольевич
Всего ответов: 1
Страница онлайн-консультации »


Консультирует Micren:

Здравствуйте, Юрий Анатольевич!
Windows Forms используют модель STA(single threaded apartment). Возможно вы уже видели атрибут [STAThreadAttribute]. Это значит, что к компоненту может получать доступ один(и тот же) поток. Единственными методами/свойствами, которые Вы можете использовать из потока не владеющего компонентом являются Invoke(), BeginInvoke(), EndInvoke(), InvokeRequired и CreateGraphics().

Обратите внимание на класс BackgroundWorker. Это асинхронный компонент на базе событий.

Если же Вам уж очень нужно обратится из другого потока к методу контрола то обратите внимание сюда: http://msdn.microsoft.com/ru-ru/library/system.windows.forms.control.invoke.aspx

Вот пример программы, с применением безопасного вызова Invoke():
Form1.h

#pragma once

namespace My164189 {

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

	/// <summary>
	/// Summary for Form1
	///
	/// WARNING: If you change the name of this class, you will need to change the
	///          'Resource File Name' property for the managed resource compiler tool
	///          associated with all .resx files this class depends on.  Otherwise,
	///          the designers will not be able to interact properly with localized
	///          resources associated with this form.
	/// </summary>
	public ref class Form1 : public System::Windows::Forms::Form
	{
	public:
		Form1(void)
		{
			InitializeComponent();
			//
			//TODO: Add the constructor code here
			//
		}

	protected:
		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		~Form1()
		{
			if (components)
			{
				delete components;
			}
		}
	private: System::Windows::Forms::Label^  label1;
	protected: 
	private: System::Windows::Forms::Button^  button1;

	private:
		/// <summary>
		/// Required designer variable.
		/// </summary>
		System::ComponentModel::Container ^components;

#pragma region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support - do not modify
		/// the contents of this method with the code editor.
		/// </summary>
		void InitializeComponent(void)
		{
			this->label1 = (gcnew System::Windows::Forms::Label());
			this->button1 = (gcnew System::Windows::Forms::Button());
			this->SuspendLayout();
			// 
			// label1
			// 
			this->label1->AutoSize = true;
			this->label1->Location = System::Drawing::Point(12, 23);
			this->label1->Name = L"label1";
			this->label1->Size = System::Drawing::Size(277, 13);
			this->label1->TabIndex = 0;
			this->label1->Text = L"Эта метка изменит  свойство Text из другого потока";
			// 
			// button1
			// 
			this->button1->Location = System::Drawing::Point(15, 49);
			this->button1->Name = L"button1";
			this->button1->Size = System::Drawing::Size(384, 23);
			this->button1->TabIndex = 1;
			this->button1->Text = L"Запустить поток изменяющий надпись на метке";
			this->button1->UseVisualStyleBackColor = true;
			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);
			// 
			// Form1
			// 
			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);
			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;
			this->ClientSize = System::Drawing::Size(411, 94);
			this->Controls->Add(this->button1);
			this->Controls->Add(this->label1);
			this->MaximizeBox = false;
			this->MaximumSize = System::Drawing::Size(427, 130);
			this->MinimizeBox = false;
			this->MinimumSize = System::Drawing::Size(427, 130);
			this->Name = L"Form1";
			this->Text = L"Form1";
			this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
			this->ResumeLayout(false);
			this->PerformLayout();

		}
#pragma endregion
		// Обработчик нажатия на кнопку запускающий фоновый поток
	private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
				 ThreadPool::QueueUserWorkItem(gcnew WaitCallback(this,&Form1::BackgroundTask),gcnew TaskArgs(this));
			 }

			 // Этот метод изменяет надпись на метке
			 void ChangeLabel()
			 {
				 label1->Text=String::Format(L"На кнопку нажали {0} раз",++count);
			 }

			 // Делегат соответствующий вызываемому методу
			 delegate void ChangeLabelDelegate();

			 // Это класс для передачи параметра задаче
			 ref class TaskArgs
			 {
			 public:
				 // Передаем ссылку на форму
				 TaskArgs(Form1^ form)
				 {
					this->form=form;
				 }
				 property Form1^ MyForm
				 {
					 Form1^ get(){return form;}
				 }
			 private:
				 Form1^ form;
			 };

			 void BackgroundTask(Object^ o)
			 {
				 TaskArgs^ args=(TaskArgs^)o;
				 // Если раскомментировать следующую строку, то при асинхронном вызове будет исключение
//				 args->MyForm->ChangeLabel();
				 // Безопасный вызов
				 args->MyForm->Invoke(gcnew ChangeLabelDelegate(args->MyForm,&Form1::ChangeLabel));
			 }

			 int count;

	private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
				 count=0;
			 }
	};
}

main():
#include "stdafx.h"
#include "Form1.h"

using namespace My164189;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
	// Enabling Windows XP visual effects before any controls are created
	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false); 

	// Create the main window and run it
	Application::Run(gcnew Form1());
	return 0;
}

К ответу прикреплен файл с приложением для MS VS 2008.

Все же следует сказать. Что подобных "фокусов" лучше избегать. В 99.9% можно и нужно обходиться без подобных вещей. Иначе Ваш код будет жестко связан с формой и это чревато возникновением трудностей при модификации программы и ошибок в ее работе при не аккуратном программировании.

Многопоточность вообще требует очень тщательного планирования и аккуратности в реализации. На первых порах постарайтесь обойтись без нее везде, где это возможно. Попробуйте сначала понять основы программирования под .NET, а не лезьте в дебри. Всему свое время.

Так же рекомендую, при программировании под .NET, вместо C++ использовать C#. Этот язык изначально ориентирован на .NET и код программы получается проще, лаконичнее и нагляднее.

Желаю удачи.

Консультировал: Micren
Дата отправки: 05.04.2009, 22:47
Рейтинг ответа:

НЕ одобряю 0 одобряю!


Оценить выпуск | Задать вопрос экспертам

главная страница  |  стать участником  |  получить консультацию
техническая поддержка

Дорогой читатель!
Команда портала RFPRO.RU благодарит Вас за то, что Вы пользуетесь нашими услугами. Вы только что прочли очередной выпуск рассылки. Мы старались. Пожалуйста, оцените его. Если совет помог Вам, если Вам понравился ответ, Вы можете поблагодарить автора - для этого в каждом ответе есть специальные ссылки. Вы можете оставить отзыв о работе портале. Нам очень важно знать Ваше мнение. Вы можете поближе познакомиться с жизнью портала, посетив наш форум, почитав журнал, который издают наши эксперты. Если у Вас есть желание помочь людям, поделиться своими знаниями, Вы можете зарегистрироваться экспертом. Заходите - у нас интересно!
МЫ РАБОТАЕМ ДЛЯ ВАС!


В избранное