webmail123 Ответов: 3

Обратные значения индикатора выполнения


Я работаю над проектом RFID. Я разработал простой графический интерфейс на основе рабочего стола с использованием Visual Studio 2008 в VB.Net. Я должен использовать VS2008, потому что я работаю на устройстве windows PDA, чтобы я мог развернуть свое приложение на windows PDA. (Ручной считыватель AB700)

Поэтому я сканирую RFID-метку с помощью КПК. Диапазон RFID-меток варьируется от 39 до 85. Означает, что если значение диапазона RFID меньше 39 или больше 85, то эта метка RFID будет считаться вне диапазона. Если RFID-метка находится близко к КПК, то значение будет равно 39 или 40. Если RFID-метка находится далеко от КПК, то значение будет от 80 до 85. Таким образом, когда мы приближаем RFID-метку ближе или дальше, значения меняются в зависимости от расстояния.

Я хочу отразить этот диапазон в индикаторе выполнения. Поэтому, если RFID-метка находится близко к КПК, то я хочу показать индикатор выполнения как полный, и по мере его удаления я хочу уменьшить значение индикатора выполнения.

Что я уже пробовал:

public void checkRFIDRange()
{
	try
	{
		string Msg=string.Empty;
		string temp=new string();
		rfid.getResult(temp) //Function to get data from RFID PDA and store it into temp variable
		Msg=temp.Substring(0,temp.IndexOf(char.MinValue)); //extract RFID tag value from temp
		
		string epc=""; //value of RFID tag
		string rssi="" //value of RFID range
		
		progressBar1.value=rssi;
	}
	
	catch()
	{
		//catch block
	}
}


Я установил минимальное значение индикатора выполнения как 39, а максимальное-как 85. (Что не имеет большого значения). Я запускаю этот код в цикле. Так что я буду получать значение значения диапазона RFID непрерывно.

Пожалуйста, предоставьте мне любые предложения

Kschuler

Почему ваш код не работает? Вы получаете ошибку? Или что происходит?
Вы должны добавить что-то к улову, просто на случай, если вы получаете ошибки. И откуда берется переменный диапазон?

webmail123

@Kschuler Спасибо за ответ.
Я хочу отразить значение rssi в индикаторе выполнения, но в обратной логике.
Так вот в чем дело

Если значение RSSI = 39 (что означает, что RFID очень близок к КПК), то я хочу отобразить индикатор выполнения как полный, а когда значение RSSI = 85 (что означает, что RFID далек от КПК), то я хочу отобразить индикатор выполнения как пустой. Поэтому по мере приближения RFID к КПК я хочу отображать значение индикатора выполнения как увеличивающееся, а по мере его удаления оно должно уменьшаться.

Насчет переменной диапазона, извините за путаницу. Я сменил его на RSSI.

3 Ответов

Рейтинг:
27

phil.o

Ну простая математическая формула для этого такова

pbValue = (85 - value) + 39 = 124 - value

Для 39 это возвратит 85; для 40, 84; и так далее до 85, где это возвратит 39.


webmail123

Лол.. Это просто смешно.. Серьезно, я должен был думать именно так.. Моя вина. Спасибо за ответ ;-)

phil.o

Добро пожаловать :)
Пожалуйста, отметьте свой вопрос как ответ, если это уместно.

Рейтинг:
2

OriginalGriff

Циклы - плохая идея в приложениях .NET: если они не находятся в другом потоке, чем исходный поток пользовательского интерфейса, а ваш - нет, сам пользовательский интерфейс не обновляется до тех пор, пока цикл не закончится и код не вернется к "нормальной обработке" и не сможет реагировать на события рисования. Поэтому, пока вы выполняете цикл, вы не видите никаких изменений!

Для такого рода вещей есть два способа сделать это:
1) Самый простой способ-не использовать цикл, а использовать таймер, который периодически считывает уровень - 1/10 секунды, вероятно, будет достаточно - и обновляет индикатор выполнения.
2) более сложный способ состоит в том, чтобы запустить новый поток для мониторинга уровней и перепечатать его обратно в основной поток с обновлениями, чтобы он мог обновить индикатор выполнения - это должно быть так, потому что вы не можете получить доступ к элементам пользовательского интерфейса извне потока, в котором они были созданы: поток пользовательского интерфейса. Один из способов сделать это-использовать Класс BackgroundWorker (System.ComponentModel)[^] экземпляр - он имеет встроенное в класс обновление прогресса, поэтому он делает жизнь намного проще, чем альтернатива вызова элементов управления для перемещения кода обратно в поток пользовательского интерфейса для обновления.


webmail123

Спасибо Вам за помощь. Мне бы очень хотелось иметь несколько основных примеров фонового работника. Я обязательно постараюсь это реализовать.

OriginalGriff

Перейдите по ссылке в моем оригинальном посте - внизу есть пример кода.

Рейтинг:
1

Member 14745082

использование системы;
использование системы.Коллекции.Общий;
использование системы.ComponentModel;
использование System.Data;
использование системы.Рисование;
использование System.Linq;
использование System.Text;
использование системы.Нарезание резьбы.Задачи;
использование системы.Окна.Формы;

пространство имен WindowsFormsApplication4
{
публичный частичный класс Form2 : форма
{
общественные формы Form2()
{
метод InitializeComponent();
}

частная dateTimePicker1_ValueChanged недействительным(объект отправителя, EventArgs в электронной)
{
Дата типа datetime = dateTimePicker1.Значение;
textBox1.Text = дата.ToString("ДД/ММ/гггг");
}

частный недействительными обработчика button1_click(объект отправителя, EventArgs в электронной)
{
таймера1.Начать();
кнопка 1.BackColor = Цвет.Коричневый;
кнопка 2.BackColor = Цвет.Белый;
}

частный недействительными методе button2_click(объект отправителя, EventArgs в электронной)
{
таймера1.Стоп();
кнопка 2.BackColor = Цвет.Коричневый;
кнопка 1.BackColor = Цвет.Белый;

}

частный недействительными timer1_Tick(объект отправителя, EventArgs в электронной)
{
инт вал = progressBar1.Значение;
int val2 = progressBar2.Value;
if(val<100)
{

Вал += 10;
progressBar1.Значение = Вэл;
}
еще

{
progressBar1.Value = 0;

}

если (val2>0)
{
val2 -= 10;
progressBar2.Value = val2;

}
еще
{
progressBar2.Value = 100;
}
}
}

}