|
Hello!
A week ago, I dealed with programming my first camera-control(live rendering). I never did something like that, so I read a lot. Because I`d like to handle with the .NET-platform without changing to C#, I started coding in C++/CLI. My problem is, dispite all that studing books, forums and so on, I still don`t know exactly how to react. There seems to be endless possibilities to get your camera-data on your screen. One option is to operate with the old-school device-contexts, like you know them from MFC-programming(but I want to code in the new syntax, so the old MFC-syntax is not my favourite). Another idea is to operate with streams. I think it`s obvious to work with streams, `cause what you receive is a flow of byte-values composing the single frames. Sounds easy, but I don`t really know how to realize it exactly. Acting Try-and-error didn`t help. So, next option is to create a Bitmap and to copy the byte-values of every frame with die interop::marshal::copy-method into the Bitmap. But doing that copy-method 15 times in a second doesn`t seem to be the right way. Searching for a advisable method, I found DirectShow. My problem is, that I´m quite a rookie in programming. I know some basics in C++, but my knowledge and experience are limited. So I avoid programming DirecX(DirectShow), cause after studing the msdn-help, it seems to me, that DirectShow is a section for itself.
So, what would you do? What would you advice me? I`m very grateful for every piece of advice or literatur and veryveryvery grateful for any code-snippet.
Thanks for your help!
|
|
|
|
|
|
I am building an application where I want to use some kinda autosave function.
I found a post about using threads but I cannot find a way to get it working...
Currently I have this:
LoadFiles() will get run at the beginning of the application. Here should the autosave thread be started...
public: Threading::Thread thd = new Thread(new ThreadStart(autoSave));
private: System::Void LoadFiles(void) {
Threading::Thread::Start();
}
private: System::Void autoSave(void) {
Threading::Thread.Sleep(5000);
}
And getting the following errors:
1>d:\app2\app2\Form1.h(424) : error C3845: 'App2::Form1::thd': only static data members can be initialized inside a ref class or value type
1>d:\app2\app2\Form1.h(58) : error C2512: 'System::Threading::Thread::Thread' : no appropriate default constructor available
1>d:\app2\app2\Form1.h(426) : error C2352: 'System::Threading::Thread::Start' : illegal call of non-static member function
1> c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : see declaration of 'System::Threading::Thread::Start'
1>d:\app2\app2\Form1.h(429) : error C2143: syntax error : missing ';' before '.'
1>d:\app2\app2\Form1.h(429) : error C2143: syntax error : missing ';' before '.'
1>Build log was saved at "file://d:\App2\App2\Release\BuildLog.htm"
Does anyone have any idea how to solve this OR how to make a better thingy? :p
Kind regards,
|
|
|
|
|
try as following
public: Threading::Thread ^thd = gcnew Thread(new ThreadStart(autoSave)); private: System::Void LoadFiles(void) {
thd->Start();
}
private: System::Void autoSave(void) { Threading::Thread.Sleep(5000);
}
|
|
|
|
|
1>d:\app2\app2\Form1.h(425) : error C3845: 'App2::Form1::thd': only static data members can be initialized inside a ref class or value type
1>d:\app2\app2\Form1.h(428) : error C2143: syntax error : missing ';' before '.'
1>d:\app2\app2\Form1.h(428) : error C2143: syntax error : missing ';' before '.'
But I corrected Threading::Thread.Sleep(5000); to Threading::Thread::Sleep(5000); which resolved those errors. Now Im still left with C3845.
|
|
|
|
|
The error message explains it.
You can't initialize "thd" like that unless you make
the variable static.
Either make the variable static, or move the initialization code
to a method, for example - the constructor:
public ref class MyClass
{
public:
System::Threading::Thread ^thd;
MyClass::MyClass()
{
thd = gcnew System::Threading::Thread(gcnew ThreadStart(this, &MyClass::autoSave));
}
private:
System::Void LoadFiles(void)
{
thd->Start();
}
System::Void autoSave()
{
Threading::Thread::Sleep(5000);
}
};
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks for your reply.
I currently have this:
public ref class Form1 : public System::Windows::Forms::Form
{
public:
System::Threading::Thread ^thd;
Form1::MyClass() {
thd = gcnew System::Threading::Thread(gcnew ThreadStart(this, &Form1::autoSave));
}
private: System::Void autoSave(void) {
Threading::Thread::Sleep(5000);
warningBox("Test? 5000");
}
private: System::Void LoadFiles(void) {
thd->Start();
}
}
But it doesnt work due the following errors:
1>d:\app2\app2\Form1.h(61) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\app2\app2\Form1.h(63) : warning C4183: 'MyClass': missing return type; assumed to be a member function returning 'int'
1>d:\app2\app2\Form1.h(62) : error C2061: syntax error : identifier 'ThreadStart'
1>d:\app2\app2\Form1.h(62) : error C2143: syntax error : missing ';' before ')'
1>d:\app2\app2\Form1.h(62) : error C2143: syntax error : missing ';' before ')'
|
|
|
|
|
iMikki wrote: But it doesnt work due the following errors:
MyClass was, well, my class name.....you need to adjust
the code to use your class name.
Are you a beginner in C++?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Quite new yes. I had some CLI C++ at university but never worked with Managed stuff...
But I did change the first part to Form1 (referencing to public ref class Form1 : public System::Windows::Forms::Form )..
Any way you could help me? :p
Or do you might have another idea to realize this 'autosave' thing.
The code I currently have is 1400 lines long. :p
Kind regards,
|
|
|
|
|
Good - I found the solution after some trying and stuff :p (fail, retry, fail again, error, swear, trying, reading, failing again, fixing, waiting, evil laughing, posting the solution on CodeProject)
Here is the code I have now:
public ref class Form1 : public System::Windows::Forms::Form
{
public:
System::Threading::Thread ^thd;
private: System::Void autoSave(void) {
Threading::Thread::Sleep(5000);
warningBox("Test? 5000");
runSave();
}
private: System::Void runSave(void) {
thd = gcnew System::Threading::Thread(gcnew System::Threading::ThreadStart(this, &App2::Form1::autoSave));
thd->Start();
}
private: System::Void LoadFiles(void) {
runSave();
}
Works like a charm!
I started the app - and 5 second later I got this message! (warningBox(std::string msg) is a messageBox produced by the Windows::Apps thingy... :p
Thnx everyone!
Edit:
This code keeps restarting the thread.
modified on Thursday, December 3, 2009 7:49 AM
|
|
|
|
|
Good morning,
I am using Visual C++ 2005 and I import excel file in my program. If data are characters and numbers no problem, but when it is a date I have difficult. The system read date as a number. How can I do so I can read a date like a string or like a date exactly ?
Can you help me ?
|
|
|
|
|
Excel stored a date using a double internally. You can use Format(The_Date "mm/dd/yyyy") is you want to pass a string with that format. Otherwise, just use a conversion function...
|
|
|
|
|
I read Excel sheet range, I can not use this Format you say because I access the range values using GetValue(i,j). The way to do is to know how it convert this date to number so that I can write a function.
Who can help me to know the algorithm use by Excel to convert date to double.
Thanks
|
|
|
|
|
Again, use the System Convert functions. You do not need to know Excel's representation, but it is fairly easy to figure out with google or changing the format of dates in excel and looking at the numbers.
|
|
|
|
|
I my side I do not know what functions to use TO CHANGE DATE TO characters, the cell format do not change something in Excel. Can you show me how to do it please
|
|
|
|
|
|
Hi there,
I have an application that has a function that receives the state change of some sockets and it is supposed to send the state change to another class of the application and notifies the state change like:
if ((param1 == 0)&& (Param2 ==0)) // if socket 0 is down
{
Sockinfo[3] = ((Sockinfo[3] & 0xFE )& 0xFF );
}
else if ((param1 == 0)&& (Param2 ==1)) // if socket 0 is up
{
Sockinfo[3] = ((Sockinfo[3] | 0x01 )& 0xFF );
}
//here I make an special message to send to another class of the application
but as sometimes the socket state changes very fast like it goes down and up in 1-2 sec, I don't want to make the notify message and send it up. I want to wait 10-15 sec and see if the state changed back again for that socket.
So if the socket goes down and stays down for 10 sec, I send the message out, if it went down but in less than 10 sec came back up, I don't send the message out.
is there any easy way to do that?
I appreciate any help
Best regards,
Chan
|
|
|
|
|
Hi,
You have to construct a simple mechanism, I suggest you add a timer and implement these two rules:
1. when the state changes, check the timer; if it is running, stop it. If the new state requires delayed action, start or restart the timer with a period equal to the wait period you want.
2. when the timer fires, check the state and if it still is what it was, launch the delayed action.
Luc Pattyn [Forum Guidelines] [My Articles]
I only read code that is properly indented, and rendered in a non-proportional font; hint: use PRE tags in forum messages
|
|
|
|
|
I want to design a UI like Adobe After Effects's TimeLine Panel as below bitmap:
The TimeLIne bitmap:http://pixinfo.com/img/sz/Adobe_After_Effects_6.5/AfterEffects6.5_02_od.jpg
The TimeLine Panel has two parts.
Left part seems to be ListView with Icon and Text,but it has hierarchy like TreeView.
Right part has a TrackBar-like time bar and a list shows the animation range(click the item of list to drag-drop the curve of translation,scaling,rotation).
How magicial the TimeLine is!! Does somebody havw any idea about the TimeList design? Or How to design the same control like the TimeLine?
|
|
|
|
|
akira32 wrote: Or How to design the same control like the TimeLine?
That control looks so complicated. You need to split that control into several small controls like slider, the point etc. Build each one separately and combine to get the whole control. In many places you may need to draw the control yourself.
Best wishes,
Navaneeth
|
|
|
|
|
I use Application::Idle to calculate FPS, but it seems to be unsuitable. Becuase the Application::Idle does not like the CWinApp::Idle in MFC.
Application::Idle event is not called in every frame. Could somebody know how to calculate FPS in Visual C++ CLR project?
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
Application::EnableVisualStyles();
Application::SetCompatibleTextRenderingDefault(false);
Form1^ form1=gcnew Form1();
Application::Idle += gcnew System::EventHandler(form1,&Form1::Form1_Idle);
Application::Run(form1);
return 0;
}
public: System::Void Form1_Idle(System::Object^ sender, System::EventArgs^ e)
{
DWORD currentTime=GetTickCount();
DWORD deltaTime=currentTime-m_PlayCurrentTime;
m_PlayCurrentTime=currentTime;
m_FPS->FrameCnt++;
m_FPS->TimeElapsed+=deltaTime;
if (m_FPS->TimeElapsed >= 1000)
{
m_FPS->CalculateFPS();
m_FPS->TimeElapsed -= 1000;
m_FPS->FrameCnt = 0;
FPStoolStripStatusLabel->Text=L"FPS=" + m_FPS->dFPS.ToString();
}
}
|
|
|
|
|
akira32 wrote: Could somebody know how to calculate FPS in Visual C++ CLR
FPS of what? What frames?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
FPS is frame per second.
Sorry! m_FPS is customized strcut as below:
ref struct sFPS
{
sFPS()
{
Init();
}
void Init()
{
FrameCnt=0;
TimeElapsed=0;
dFPS=0;
}
void CalculateFPS()
{
dFPS = (Double)FrameCnt / (TimeElapsed/1000.0f);
}
DWORD FrameCnt;
DWORD TimeElapsed;
Double dFPS;
};
In MFC project, I can use the CWinApp::Idle to count the frame number for FPS. But in CLR project. Application::Idle is not always called(must have some windows messages be triggerred), so I cannot use it to calculate FPS if the mouse does not focus on the winform. I want to find a event that will be called at any time.
modified on Tuesday, November 24, 2009 12:14 AM
|
|
|
|
|
akira32 wrote: FPS is frame per second.
Right. But I asked "FPS of what? What frames?"
Video?
akira32 wrote: I want to find a event that will be called at any time
A Timer[^] maybe?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Not for video. I use for DirectX.
|
|
|
|