Ваш терминал, скорее всего, использует символы Unicode (обычно в кодировке UTF-8), поэтому выбор подходящего шрифта для просмотра вашего любимого символа - это только вопрос. Я использую Unicode char U + 2588, «Полный блок».
Попробуйте следующее:
import unicodedata
fp= open("character_list", "w")
for index in xrange(65536):
char= unichr(index)
try: its_name= unicodedata.name(char)
except ValueError: its_name= "N/A"
fp.write("%05d %04x %s %s\n" % (index, index, char.encode("UTF-8"), its_name)
fp.close()
Изучите файл позже с вашим любимым зрителем.
curses - это модуль, который вы хотите использовать. Проверьте это учебник .
Если вы используете локальную очередь, вам не нужен WCF.
Вот как выглядит мой пример службы (класс службы из проекта службы Windows):
using System.Messaging;
public partial class MQProcessTest1 : ServiceBase
{
//a name of the queue
private const string MqName = @".\Private$\test1";
//define static local private queue
private static MessageQueue _mq;
//lazy local property through which we access queue (it initializes queue when needed)
private static MessageQueue mq
{
get
{
if (_mq == null)
{
if (!MessageQueue.Exists(MqName))
MessageQueue.Create(MqName);
_mq = new MessageQueue(MqName, QueueAccessMode.ReceiveAndAdmin);
_mq.Formatter = new BinaryMessageFormatter();
}
return _mq;
}
}
//constructor
public MQProcessTest1()
{
InitializeComponent();
//event to process received message
mq.ReceiveCompleted += new ReceiveCompletedEventHandler(mq_ReceiveCompleted);
}
//method to process message
private void mq_ReceiveCompleted(object sender, ReceiveCompletedEventArgs e)
{
//queue that have received a message
MessageQueue cmq = (MessageQueue)sender;
try
{
//a message we have received (it is already removed from queue)
Message msg = cmq.EndReceive(e.AsyncResult);
//here you can process a message
}
catch
{
}
//refresh queue just in case any changes occurred (optional)
cmq.Refresh();
//tell MessageQueue to receive next message when it arrives
cmq.BeginReceive();
}
protected override void OnStart(string[] args)
{
//let start receive a message (when arrives)
if (mq != null)
mq.BeginReceive();
//you can do any additional logic if mq == null
}
protected override void OnStop()
{
//close MessageQueue on service stop
if (mq != null)
mq.Close();
return;
}
}
Похоже, вам необходимо изучить WCF.
Очереди в Windows Communication Foundation
Выравнивание нагрузки. Отправка заявок может перегрузить получающие приложения с сообщениями. Очереди могут управлять несоответствие составления сообщений и нормы потребления, чтобы приемник не перегружен.
Вот пример с использованием WCF и MSMQ
У меня сложилось впечатление, что MSMQ был создан для совместимости с продуктом IBM MQ. Если это , вы можете вызвать MQGET с таймаутом и вообще не беспокоиться об опросе.
Просто удалите сообщение из очереди с двухсекундным таймаутом (например). Если он там был, обработайте его. Затем либо выйдите из службы, если хотите, либо вернитесь к MQGET с ожиданием.
Это означает, что ваша служба не будет излишне потреблять процессорное время, но она все равно сможет своевременно завершить работу при получении сигнала.
Обычно , у вас будет что-то вроде:
Set up all queue stuff.
while true:
Read from queue with 10-second timeout.
If message was read:
Process message
If signaled to exit:
break
Tear down queue stuff.
Exit.
Имейте в виду, что пример службы будет заблокирован при OnStart (). Вместо этого запустите рабочий поток:
protected override void OnStart(string[] args)
{
IntPtr handle = this.ServiceHandle;
myServiceStatus.currentState = (int)State.SERVICE_START_PENDING;
SetServiceStatus(handle, ref myServiceStatus);
// Start a separate thread that does the actual work.
if ((workerThread == null) ||
((workerThread.ThreadState &
(System.Threading.ThreadState.Unstarted | System.Threading.ThreadState.Stopped)) != 0))
{
workerThread = new Thread(new ThreadStart(ServiceWorkerMethod));
workerThread.Start();
}
}
затем вызовите BeginReceive () из рабочего.