|
I am using ReadDirectoryChangesW to detect changes on a file in an MFC app (basically watches the containing directory and then sees if it was the specified file).
When I modify the file and save, the event is detected and the thread calls the main application thread to process. However, it appears that a file modification (or creation for that matter) generates 3 or 4 notification records all containing the FILE_ACTION_MODIFIED constant. This results in the event handler processing the event multiple times instead of once giving poor performance. First do they represent different updates (eg. content, attributes) and second is there a simple way of differentiating between them without writing complicated code checking attributes, etc?
I tested Wes Jones's DirWatcher project and it does the same thing.
TIA
|
|
|
|
|
Does FindFirstChangeNotification() work any better?
"One must learn from the bite of the fire to leave it alone." - Native American Proverb
|
|
|
|
|
Not the suggestion I wanted to hear as I anticipate a time-consuming restructuring of some stuff but anyway. Having looked at the MSDN stuff though, I can't see how it would be different since it's the events that are raised that's the issue. I would imagine the same file system events would be notified regardless of which function one is using to get them. Good idea though. If all else comes to nought, I'll give FindFirstChangeNotification() a go.
Thanks
|
|
|
|
|
i knew its a beginner question but still
i need to open dialog that in my project with the code
not with DoModel because in need the dialog that opend the
new dialog to keep on running
|
|
|
|
|
DoModeless then. Sorry, I don't have a lot of experience with Modeless Dialogs, though.
Danny
The stupidity of others amazes me!
|
|
|
|
|
you need a modeless dialogs.
CMyDialog mydialog;
mydialog.create(...);
mydialog.showwindow(...);
or
CMyDialog *pMydialog;
pMydialog = new CMyDialog;
pMydialog->Create(...);
pMydialog->ShowWindow(...);
-prakash
|
|
|
|
|
As others stated you need to use Modeless dialogs in your application,
you can learn how to create and use them from here[^]
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
-- modified at 13:10 Monday 3rd October, 2005
|
|
|
|
|
morning, this app works fine in debug but crash on release mode with access violation. I have tried to turn optimazation to default, still no luck. it's a motithreading app, anybody got experience about this? here is the call stack when it crash:
USER32! 77e338b0()
CDialog::EndDialog(CDialog * const 0x00000000 {CDialog hWnd=???}, int 2) line 580 + 13 bytes
CDialog::OnCancel(CDialog * const 0x00000000 {CDialog hWnd=???}) line 709
CSurchrgDlg::Exit() line 270
Run(void * 0x0012f75c) line 310
_AfxThreadEntry(void * 0x0012f280) line 112 + 5 bytes
ADDSURCHRG! _beginthreadex + 202 bytes
KERNEL32! 7c57b388()
|
|
|
|
|
simply put, you window is not valid when it was closed.
Yes, these kind of problems are quite common in VC++ w.r.t apps running in Debug and not working on Release.
Since you need to take care while multithreading in MFC, I do notknow how the you have created the window, which thread own/created the window. Does that thread has its own message loop, etc ,etc.
-prakash
|
|
|
|
|
Thank you for the reply
here is part of the dialog window:
BOOL CSurchrgApp::InitInstance()
{
.....
CSurchrgDlg dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
}
when I set breakpoint at dlg.DoModal(); I would get the &dlg, dlg and m_pMainWnd with {CSurchrgDlghWnd=0x0000000}, but this seems like the standard coding, not sure why it's getting all the 00000000......
|
|
|
|
|
See http://www.codeproject.com/debug/survivereleasever.asp
|
|
|
|
|
Using Shared Memory with a large structure, but when I start a new project using the current one as a basis, the names referenced in the structure are the old names and not the new names.
If I type in the new names then All OK, but if I select old name from list error (as would expect). But how to arrange for the display of new structure items in the list.
Is this an IDE bug or does the registry need a tidy up (and how).
<br />
struct TSharedMemory{<br />
....<br />
....<br />
};<br />
<br />
g_hMap = ::CreateFileMapping((HANDLE) 0xFFFFFFFF,<br />
NULL,<br />
PAGE_READWRITE,<br />
0,<br />
sizeof(TSharedMemory),<br />
"TP_SharedMem"<br />
);<br />
if(g_hMap == NULL)<br />
{<br />
int s = GetLastError();<br />
g_szFormatting.Format ("Shared Memory Not Obtained (Signals); Error = %d", s); <br />
AfxMessageBox(g_szFormatting);<br />
}<br />
else<br />
{<br />
g_hMap = (TSharedMemory*)::MapViewOfFile(g_hMap,FILE_MAP_WRITE,0,0,sizeof(TSharedMemory));<br />
<br />
memset(g_pMem, 0, sizeof(TSharedMemory));<br />
}<br />
<br />
memcpy(&g_pMem->tips.buffer, &BCbuffer.data , sizeof(BCbuffer.data));
i.e. when you type &g_pMem-> its the old names that are shown.
|
|
|
|
|
hi,
i want to know if it's possible to trigger an event in ms-word from mi MFC project, i.e. trigger a button click event without clicking that button with the mouse..
thanx
|
|
|
|
|
Hi,
I've put a ComboBox control into a toolbar using clickety[^], and want to trap the user pressing enter. However, this keypress seems to disappear into the aether, and I can't trap it using OnChar, OnSelendok, or any of the other message handlers I've tried, in any of the Main Frame, view or combobox classes!
Any idea where the Enter keypress goes?
|
|
|
|
|
Not sure about ComboBoxes as I've not tried to do this, but have you tried handling the CBEN_ENDEDIT message from WM_NOTIFY?
In your message map add
ON_NOTIFY_REFLECT(CBEN_ENDEDIT, OnEndEdit)
and in your class you'd add a method such as
void Class::OnEndEdit (NMHDR *pNMHDR, LRESULT *pResult)
{
...
*pResult = 0;
}
I did something akin to this when catching the end of someone editing a List Control edit thingmy.
Note that I make no guarantee's that this will do anything close to what you want.
|
|
|
|
|
As an additional note, you should cast pNMHDR to a NMCBEENDEDIT*, and it will show you the reason why you're in your function:
NMCBEENDEDIT* pCBEnd = (NMCBEENDEDIT*)pNMHDR;
if (pCBEnd->iWhy == CBENF_RETURN)
Or something like that.
I'd try coding it up to prove my theory, but I'm too busy thinking up silly things to say in the Lounge.
|
|
|
|
|
Thanks for the suggestions. I found this[^] which sorted it out in a slightly different way.
|
|
|
|
|
Hello everybody,
I have next problem :
I have a MFC Dialog based application and i am retrieving some info from a *.mdb database using CDatabase and CRecordSet classes. I am doing this without any problems.
But my question is how to add a new record in this database ?
My code looks like this :
CDatabase database;
CString sSQL;
CString sName,sSurname,sID;
CString sDriver = "MICROSOFT ACCESS DRIVER (*.mdb)";
CString sFile = "c:\\db1.mdb";
CString sDsn;
sDsn.Format("ODBC;DRIVER={%s};DSN='';DBQ=%s",sDriver,sFile);
TRY
{
database.Open(NULL,false,false,sDsn);
CRecordset recset( &database );
database.Close();
}
CATCH(CDBException, e)
{
AfxMessageBox("Database error: "+e->m_strError);
}
END_CATCH;
I guess i'm supposed to use AddNew() ,Requiry() ,Update() functions.
MSDN says : "AddNew prepares a new, empty record using the recordset's field data members. After you call AddNew, set the values you want in the recordset's field data members. " - how can i set the values ???
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
-- modified at 9:22 Monday 3rd October, 2005
|
|
|
|
|
Hi how ru
this is Vikas again
put this code in the Try block
CString SqlString;
// write the query and attach to the SqlString
database.ExecuteSQL(SqlString);
This is the simple way but i dont think u have
a static data , Meaning u r going to get data
from the user and then add it to the database
right for that u need to use format string that
is bit syntatic .
ok
take care
Vikas Amin
Embin Technology
Bombay
vikas.amin@embin.com
|
|
|
|
|
could you be more explicit?
can you provide sample code ?
thanks
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
-- modified at 10:14 Monday 3rd October, 2005
|
|
|
|
|
Try to use the query i have given u
in this code in the TRY block
SqlString.Format(_T("INSERT INTO Recordset_name(ID,Name,Surname) VALUES
(%d,%s,%s)"),i_ID,c_Name,c_surname);
database.Exectue(SqlString);
Vikas Amin
Embin Technology
Bombay
vikas.amin@embin.com
|
|
|
|
|
I've added next code in TRY block
...
CString name,surname;
name="Jon";
surname="Doe";
int nID=200;
SqlString.Format("INSERT INTO Table1 (ID,Name,Surname) VALUES (%d,%s,%s)",nID,name,surname);
database.ExecuteSQL(SqlString);
...
but i get exception thrown , with message box : "Database error. Too few parameters.Expected 2"
after i modified the code like this :
SqlString = "INSERT INTO Table1 (ID,Name,Surname) VALUES ('200','jon','doe') ";
everything is ok ,do you know whats wrong with the previous code
thanks for help
[Fixed]
I found out why exception was thrown.
Instead of :
SqlString.Format(_T("INSERT INTO Recordset_name(ID,Name,Surname) VALUES<br />
(%d,%s,%s)"),i_ID,c_Name,c_surname);
I had to write :
SqlString.Format(_T("INSERT INTO Recordset_name(ID,Name,Surname) VALUES<br />
('%d','%s','%s')"),i_ID,c_Name,c_surname);
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
-- modified at 15:50 Monday 3rd October, 2005
|
|
|
|
|
Hi Giorgi,
I use http://www.codeproject.com/database/caaadoclass1.asp[^]
With those classes, you first need to open a transaction in CADODatabase, then call AddNew in CADORecordset, then call CommitTransaction in CADODatabase to commit the changes to the database. Your classes might be similar. You also need to make sure that you have select and editing privileges in the database!
HTH.
|
|
|
|
|
thanks
I'll take a look
"Success is the ability to go from one failure to another with no loss of enthusiasm." - W.Churchill
|
|
|
|
|
Hi
To add new Record
1. open RecordSet
2. Call AddNew()
3. Assign values to field variables (rs.m_Name = "John"; )
4. Call Update()
but in this case I think your Recordset is readonly,you most open it using ODBC or DSN.
Iman Ghasrfakhri
-- modified at 11:41 Monday 3rd October, 2005
|
|
|
|
|