Using ACE with C++ CLI
Introduction
This article demonstrates something I should have tested years ago. I’ve been wondering about the power and limitations of the Microsoft c++ cli for years, nearly always choosing c# for my .Net development needs.
What if it is possible to combine a powerful c++ framework like ACE with .Net Microsoft c++ cli and mixed mode programming? Turns out it works quite well.
The simple purpose of this program will be to execute code in a native thread, and return a result to the calling managed code.
Prerequisites
Compile ACE as described by the included documentation. I’ll assume you know how to set up the include and library paths for the project, and how to set up a mixed mode c++ cli project.
Follow this link to download ACE
Coding
What really surprised me was how easy it was – it probably shouldn’t, but it did.
First we create a Visual C++ Windows Forms Application.
We are going to pull in a few header files from ACE, so open stdafx.h and add the following:#ifndef STRICT
#define STRICT
#endif
#pragma managed(push,off)
#include <sdkddkver.h />
#include "ace/Log_Msg.h"
#include "ace/Svc_Handler.h"
#include "ace/Method_Request.h"
#include "ace/Activation_Queue.h"
#include "ace/Future.h"
#include <vector>
#include <string>
#pragma managed(pop)
#pragma managed(push,off)
and #pragma managed(pop)
turns off and on managed code compilation respectively, enabling unmanaged code compilation.
In ACEDotNetDemo.cpp which contains our c++ cli main method we add the following just before our main method.
#pragma managed(push,off)
#ifndef _DEBUG
#pragma comment(lib,"ace")
#else
#pragma comment(lib,"aced")
#endif
#pragma managed(pop)
This lets the linker know that we want to link against "ace.lib" or "aced.lib" in release or debug builds respectively.
The main
method is fairly standard, we only call ACE::init()
and ACE::fini()
to initialize and finalize the framework.
[STAThreadAttribute]
int main(array<:string> ^args)
{
int result = ACE::init();
if(result >= 0)
{
// 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 MainForm());
ACE::fini();
}
return result;
}
In ACEDotNetDemoTask.hpp we declare a very simple class ACEDotNetDemoTask
derived from ACE_Task_Base
. This our thread implementation, and the svc
method is executed in an other thread.
#pragma once
#pragma managed(push,off)
typedef ACE_Future<int> IntFuture;
class ACEDotNetDemoTask :
public ACE_Task_Base
{
ACE_Activation_Queue
activation_queue_;
public:
ACEDotNetDemoTask(void);
~ACEDotNetDemoTask(void);
virtual int svc (void);
int enqueue (ACE_Method_Request *request);
IntFuture call_exit();
};
typedef ACE_Singleton<ACEDotNetDemoTask, ACE_Null_Mutex>
ACEDOTNETDEMOTASK;
class ExitMethodRequest :
public ACE_Method_Request
{
IntFuture result_;
public:
ExitMethodRequest(IntFuture& result)
: result_(result)
{
ACE_TRACE ("ExitMethodRequest::ExitMethodRequest");
}
~ExitMethodRequest( )
{
ACE_TRACE ("ExitMethodRequest::~ExitMethodRequest");
}
// Sets the value of the IntFuture to -1, and
// returns -1 causing the svc method to exit.
virtual int call (void)
{
ACE_TRACE ("ExitMethodRequest::call");
int result = -1;
result_.set(result);
return result;
}
};
#pragma managed(pop)
We use ACE_Singleton
to declare a singleton, ACEDOTNETDEMOTASK
, for our ACEDotNetDemoTask
.
ACEDotNetDemoTask.cpp contains the implementation of ACEDotNetDemoTask
.
The svc
method dequeues method requests from the activation queue, and calls the call
method of the dequed request until the call
method returns -1, quite similar to a standard windows message loop.
int ACEDotNetDemoTask::svc (void)
{
ACE_TRACE ("ACEDotNetDemoTask::svc");
while (1)
{
auto_ptr<ace_method_request />
request (this->activation_queue_.dequeue ());
if (request->call () == -1)
{
break;
}
}
return 0;
}
The enqueue
method equeues request into the activation queue, for servicing by the svc
method
int ACEDotNetDemoTask::enqueue (ACE_Method_Request *request)
{
ACE_TRACE ("ACEDotNetDemoTask::enqueue");
return this->activation_queue_.enqueue (request);
}
call_exit
enques an ExitMethodRequest to the activation queue, and returns an IntFuture that allows the caller to get the result from the unmanaged thread.
IntFuture ACEDotNetDemoTask::call_exit()
{
ACE_TRACE ("ACEDotNetDemoTask::call_exit");
IntFuture result;
ExitMethodRequest *request = new ExitMethodRequest(result);
enqueue(request);
return result;
}
#pragma managed(pop)
That takes care of our unmanaged thread implementation based on ACE_Task_Base
.
Interacting with the unmanaged thread from managed c++ cli code is as you can see really, really simple.
protected:
virtual void OnShown(EventArgs^ e) override
{
System::Windows::Forms::Form::OnShown(e);
// Start unmanaged thread
ACEDOTNETDEMOTASK::instance()->activate();
}
virtual void OnFormClosing(FormClosingEventArgs^ e) override
{
// Call unmanaged thread, and tell it to exit
IntFuture futureResult = ACEDOTNETDEMOTASK::instance()->call_exit();
// and get the result
int result = 0;
futureResult.get(result);
// Wait for the unmanaged thread to exit
ACEDOTNETDEMOTASK::instance()->wait();
System::Windows::Forms::MessageBox::Show(
String::Format(L"Exit Result:{0}",result),
L"Call Exit");
System::Windows::Forms::Form::OnFormClosing(e);
}
Concluding remarks
No doubt, many of you already know that integrating managed and undamaged code using mixed mode c++ cli works amazingly well. But I guess there are many like me who thought this a tantalizing, even probable, idea – but just never got around to verifying it.
What I’ve implemented is a simple active object in unmanaged code; and interacted with it successfully from managed code.
So in the hope that some of you may find it useful, I wrote this little article demonstrating that it actually works very well.
History
6th of January 2011 - Initial posting
Post Comment
Здравствуйте,
Хочу купить ваш сайт - за какую цену вы его продаете?
Также могу сделать предложение первым – дайте знать если интересно и я отвечу предложением.
Обязательно укажите:
- URL сайта
- Количество уникальных посетителей/сутки
- Доходы по источникам (если есть)
Спасибо,
Кирилл
П.С: Свяжитесь со мной СЕГОДНЯ (!) так как я рассматриваю и другие сайты.
Email: imonfenix@gmail.com
Telegram: @imonfenix
Skype: join.skype.com/invite/aCFL0qc5eEIzПриветствую!
Отправим Ваше коммерческое предложение владельцам/администраторам более 800 000 сайтов!
Несколько плюсов при сотрудничестве с нами:
- Приятные цены - нам выгодно, чтобы заказчик получал прибыль, значительно превышающую стоимость рассылки и обращался снова
- Все максимально прозрачно:
Предоставим скриншоты из софта, с подробными отчетами о результатах рассылки, подтверждающие выполнение обязательств с нашей стороны.
- В отличии от большинства наших конкурентов, оплата ТОЛЬКО за УСПЕШНО доставленные сообщения.
Свяжитесь с нами в течении суток и в качестве бонуса, получите бесплатное составление оффера для Вашей рассылки!
Наш E-mail: formmarketing2020@gmail.com
P.S. Извините за беспокойство, если мы с Вами уже сотрудничаем.Здравствуйте, у меня такой вопрос сколько лететь до Марса? Текущий вопрос меня глодит потому что в новостной ленте прочитал, что Илон Маск будет запускать ракету на Марс в 2050 году! К чему готовиться?
Заработай на общении в Ватсапе!!!
Любишь общаться в Ватсапе?
А ты знаешь, что Ты можешь на этом зарабатывать ежемесячно от 5.000 до 50.000 рублей??
Напиши мне в Ватсап на номер: +79146132190, и я расскажу, как иметь дополнительный доход, выполняя простые Задания (1-2 часа в день, в любое удобное время, график работы – гибкий).
Это не сетевой маркетинг, не рассылка Спама! Никаких затрат, кроме личного времени!!!
P.S. Набираю ВСЕГО 15 человек, сохраняй мой номер телефона себе в Контакты, и пиши прямо сейчас!!!Привлекаем клиентов в Ваш бизнес, с помощью рассылки в формы обратной связи сайтов.
В наличии несколько баз, суммарным объемом более 5 млн сайтов СНГ.
Предоставляем скриншоты, подтверждающие выполнение обязательств с нашей стороны.
Приятные цены - нам выгодно, чтобы заказчик получал прибыль, значительно превышающую стоимость рассылки и обращался повторно.
В отличии от большинства наших конкурентов, оплату берем ТОЛЬКО за УСПЕШНО доставленные сообщения.
Напишите пожалуйста ответ на нашу почту: silinitcha1979@mail.ru
Если Вам удобнее другой способ связи, напишите на почту, какой именно.
P.S. Извините за беспокойство, если мы с Вами уже сотрудничаем.Графской Виктор Николаевич 1975 года рождения, уроженец г.Москва.
Финансовый советник и ведущий аналитик инвестиционной компании "Атон". Плодотворно сотрудничал с "E3 Investment", известной успешными вложениями в высоколиквидную недвижимость.
Активный участник многих бизнес форумов, выступающий с актуальными докладами и предлагающий решения в сложных аспектах малого и среднего бизнеса.
Виктор Николаевич, неоднократно был отмечен в активном привлечении инвестиций в сельское хозяйство Краснодарского края. Нельзя не отметить пользу от общественной деятельности в Московском регионе, такую как благотворительность и меценатство.Мы можем помочь сделать для Вас сайт визитку в Вашем городе Старощербиновской Краснодарского края?.
Выгодно сделаем, продвинем в Яндекс, Гугл пишите на seo-websait@yandex.ru
Работаем по Краснодарскому краю, все чаще у нас заказывают с Армавира.
Звоните, мы готовы сделать для Вас, качественный и самое главное не дорогой интернет ресурс для Вас и Вашего бизнеса. Кстати наш номер +7(967)665-46-33, +7(988)667-88-72Подробнее напишите что Вам нужно? Сайт визитка, Корпоративный сайт и Т.Д.
Объясните подробней!Добрый вечер друзья! Друзья, знает где с гарантией заказать сайт в Славянск-на-Кубани Краснодарского края?
В наше время нельзя верить всем студиям. Очень жду отзывов и рекомендаций!K3ddkI sarko carla divorce divorce par consentement mutuelle
1D5z71 Muchos Gracias for your article post.Much thanks again. Awesome.
35nUW5 Spot on with this write-up, I actually think this website needs far more consideration. I'll in all probability be once more to read way more, thanks for that info.
ZtJ3Ig Hello.This post was really motivating, particularly since I was searching for thoughts on this matter last Friday.
iOgnVS Hello, i believe that i saw you visited my site so i got here to ���return the desire���.I'm attempting to to find things to enhance my website!I suppose its ok to make use of a few of your ideas!!
oNfTVr Generally I don't read post on blogs, but I would like to say that this write-up very forced me to try and do so! Your writing style has been amazed me. Thanks, quite nice post.
MBpj4I Appreciate you sharing, great blog.Thanks Again. Much obliged.
Жизнь сталкивает нас с проблемами юридического характера в независимости от нашего желания. Во всяком случае, это происходит чаще, чем мы сами обращаемся к закону, обычно, это печальные обстоятельства и плохие ситуации, когда сложно найти решение, ведь простые люди не осведомлены о деталях всех нюансов законодательства страны.
Наш портал mnogozakonov.ru поможет вам уладить любую проблему на уровне закона. У нас вы найдёте любой закон, который будет касаться вашего вопроса, а также попасть по адресам на правительственные ресурсы, которые, может быть, вам помогут информацией и поиском решения проблемы. Отдельно выделены самые актуальные законы, с которыми доводится сталкиваться очень часто. Для вас также представлены все кодексы Российской Федерации, которые могут понадобиться в решении определенных дел.
Однако это не все! Вы сможете задать любой вопрос у нас на портале, и наш специалист бесплатно ответит на него быстро и грамотно. Если вам необходима более обстоятельная консультация, вы сможете поговорить со специалистами по телефону, размещённому на портале.I don't even know what to say, this made things so much easire!
EnCPYX Major thankies for the blog post.Really thank you! Fantastic.
j0Whk8 Thanks for the blog post.Really thank you! Really Cool.
RIYd5C Say, you got a nice post.Really thank you! Really Cool.
gBfE2v Muchos Gracias for your blog post.Much thanks again. Will read on...
mRVR78 A round of applause for your blog.Really thank you! Fantastic.
казино лас вегас в спб еще казино golden games отзывы.
игровые автоматы garage играть бесплатно и онлайн казино проверенные способы.
казино европа схема проезда, казино европа отзывы владельцев!
как играть в игровые автоматы на деньги онлайн в россии, игровые автоматы онлайн на деньги в рублях.
онлайн казино europa casino еще рулетка на деньги отзывы работников.
казино фортуна, игровые крейзи автоматы.
GsZNFE I cannot thank you enough for the post.Really thank you! Keep writing.
6nHIL7 I value the blog post.Much thanks again. Much obliged.
P54QFL I loved your post.Thanks Again. Great.
3DcdCd I really liked your article.Thanks Again. Keep writing.
u1aXhQ I cannot thank you enough for the post. Fantastic.
oaGF5J Enjoyed every bit of your blog article.Much thanks again. Want more.
a7lCzm I loved your article post.Really thank you! Great.
yvjYPG Thank you for your article post. Much obliged.
ILcLao Looking forward to reading more. Great blog post.Thanks Again. Much obliged.
aroayiocrfmw
gdbxnhycnfvb
jez buy anastrozole - anastrozole versus tamoxifen based, what is anastrozole used for in men
aozcfodwvxov
lbfwqzdgetkt
prices for cialis walmart - /#41954; generic cialis professional can you mix viagra and cialis
how much does cialis cost per pill - /#7274; if cialis doesnt work generic cialis online reviews
cialis 10mg online - /#42860; generic cialis does work generic cialis vs generic viagra
Since Before up the an ounces balding. This is cause or fruit, protein. Generally the basically is the child from.
I must say nice work guys .keep up with your good work.We always look forward to your work.